从 table 中选择最新数据
Selecting most recent data from table
我有一个名为 item_histories
的 table 设置,其设置如下所示。
+--------------------------------+
| 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 |
+--------------------------------+
我正在尝试 select 每个 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`)
是我尝试完成此操作的尝试,但它所做的只是 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
returns each itemid 的日期最大值。您可以 运行 单独查询内联视图,以查看(并确认)它 return 的内容。
我们使用来自该查询的 return 行,就好像它是 table 一样。 (在 MySQL 术语中,这实际上称为 "derived table"。)
我们执行返回 item_histories
table 的连接操作,以获取具有匹配 itemid
和匹配 [=18] 的 date
的行=] return来自内联视图。
我在回答的开头指出,只要 (itemid,date)
在 table 中是唯一的,这就会起作用。如果这不是唯一的,我们有可能 returning 具有相同 itemid
和 date
.
的多行
(抱歉,无论 Sequelize 生成那个 SQL 语句需要什么奇怪的语法,我都帮不了你。至少,Sequelize 应该提供某种 "raw SQL" 方法,它将让您解决这些限制。)
(还有其他 MySQL 查询模式可以 return 等效结果。)
跟进
添加一个连接到 items
table(假设 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
我有一个名为 item_histories
的 table 设置,其设置如下所示。
+--------------------------------+
| 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 |
+--------------------------------+
我正在尝试 select 每个 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`)
是我尝试完成此操作的尝试,但它所做的只是 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
returns each itemid 的日期最大值。您可以 运行 单独查询内联视图,以查看(并确认)它 return 的内容。
我们使用来自该查询的 return 行,就好像它是 table 一样。 (在 MySQL 术语中,这实际上称为 "derived table"。)
我们执行返回 item_histories
table 的连接操作,以获取具有匹配 itemid
和匹配 [=18] 的 date
的行=] return来自内联视图。
我在回答的开头指出,只要 (itemid,date)
在 table 中是唯一的,这就会起作用。如果这不是唯一的,我们有可能 returning 具有相同 itemid
和 date
.
(抱歉,无论 Sequelize 生成那个 SQL 语句需要什么奇怪的语法,我都帮不了你。至少,Sequelize 应该提供某种 "raw SQL" 方法,它将让您解决这些限制。)
(还有其他 MySQL 查询模式可以 return 等效结果。)
跟进
添加一个连接到 items
table(假设 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