从表中select最新的数据

我有一个名为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 | +--------------------------------+ 

我试图为每个itemIdselect最近的行,就像这样..

 +--------------------------------+ | 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`)是我试图完成这个的,但是它所做的只是select第一行,但是有一个最近的date

如果(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的最大date值。 您可以单独运行内联视图查询,查看(并确认)它返回的内容。

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

我们执行连接操作返回到item_histories表,以获得匹配的itemid和与内联视图返回的max_date匹配的date的行。

我在答案的开头注意到,只要(itemid,date)在表中是唯一的,这个就可以工作。 如果这不是唯一的,我们有可能返回多个具有相同itemiddate

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

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


跟进

要向items表添加itemid (假定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