我有一个名为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
。
答案 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
匹配的匹配date
和max_date
的行图。
我在答案的开头注意到,只要(itemid,date)
在表格中是独一无二的,这将有效。如果这不是唯一的,我们可能会返回多个具有相同itemid
和date
的行。
(对不起,我无法帮助你解决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