从 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 具有相同 itemiddate.

的多行

(抱歉,无论 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