从表中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 | +--------------------------------+
我试图为每个itemId
select最近的行,就像这样..
+--------------------------------+ | 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)
在表中是唯一的,这个就可以工作。 如果这不是唯一的,我们有可能返回多个具有相同itemid
和date
。
(对不起,我无法帮助你使用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