从表中选择最新数据

时间:2015-07-01 00:54:41

标签: mysql node.js sequelize.js

我有一个名为item_histories的表设置,其设置如下。

+--------------------------------+
|  id  itemId    date    price   |
+--------------------------------+
| 1    2    2015-01-10    310    |
| 2    2    2015-01-11    318    |
| 3    2    2015-01-12    326    |
| 4    2    2015-01-13    333    |
| 5    2    2015-01-14    335    |
| 6    6    2015-01-10    121598 |
| 7    6    2015-01-11    121598 |
| 8    6    2015-01-12    122666 |
| 9    6    2015-01-13    122666 |
| 10   6    2015-01-14    122666 |
+--------------------------------+

我正在尝试为每个itemId选择最近的行,就像这样..

+--------------------------------+
|  id  itemId    date    price   |
+--------------------------------+
| 5    2    2015-01-14    335    |
| 10   6    2015-01-14    122666 |
+--------------------------------+

我正在使用Sequelize,这是我现在的代码。

db.itemHistory.findAll({
    attributes: [
        'id',
        'price',
        'itemId',
        [db.Sequelize.fn('max', db.Sequelize.col('date')), 'date']
    ],
    group: ['itemId'],
    limit: 1
}).then(function(histories) {
    console.log(histories);
});

生成此查询SELECT `id`, `price`, `itemId`, max(`date`) AS `test` FROM `item_histories` AS `itemHistory` GROUP BY `itemId` LIMIT 1

MAX(`date`)是我尝试完成此操作,但它所做的就是选择第一行,但最新一行date

1 个答案:

答案 0 :(得分:2)

如果(itemId,date)中的item_histories是独一无二的,您可以执行以下操作:

 SELECT s.id
      , s.price
      , s.itemid
      , s.date
   FROM ( SELECT q.itemid
               , MAX(q.date) AS max_date
            FROM item_histories q
           GROUP BY q.itemid
        ) r
   JOIN item_histories s
     ON s.itemid = r.itemid  
    AND s.date   = r.max_date
  ORDER BY s.itemid

内嵌视图r会返回每个 itemid的最大日期值。您可以单独运行该内联视图查询,以查看(并确认)它返回的内容。

我们使用从该查询返回的行,就好像它是一个表一样。 (在MySQL术语中,这实际上称为“派生表”。)

我们执行一个返回item_histories表的连接操作,以获取与内联返回的itemid匹配的匹配datemax_date的行图。

我在答案的开头注意到,只要(itemid,date)在表格中是独一无二的,这将有效。如果这不是唯一的,我们可能会返回多个具有相同itemiddate的行。

(对不起,我无法帮助你解决Sequelize生成SQL语句所需的任何奇怪的语法。至少,Sequelize应该提供某种“原始SQL”方法,让你解决这些限制。)

(还有其他MySQL查询模式可以返回相同的结果。)

<强>后续

items表添加联接(假设itemid是引用item(id)的外键

从上面重复相同的查询,更改(添加的行)位于注释虚线之间。

 SELECT s.id
      , s.price
      , s.itemid
      , s.date
 -- ---------------------------------  
      , t.id      AS t_id
      , t.col2    AS t_col2
 -- ---------------------------------   
   FROM ( SELECT q.itemid
               , MAX(q.date) AS max_date
            FROM item_histories q
           GROUP BY q.itemid
        ) r
   JOIN item_histories s
     ON s.itemid = r.itemid  
    AND s.date   = r.max_date
 -- ---------------------------------  
   JOIN items t
     ON t.id = r.itemid
 -- ---------------------------------  
  ORDER BY s.itemid