使用共享主键检索mysql中的最后一行

Posted

技术标签:

【中文标题】使用共享主键检索mysql中的最后一行【英文标题】:Retrieve last row in mysql with shared primary key 【发布时间】:2018-02-02 09:12:36 【问题描述】:

我有一个主键为 2 个值的表 - id 和时间戳。 该表包含每个 item_id 的多行,时间戳是使其唯一的原因。 考虑到这种设置,我可以执行有效的查询吗?我想找到 item_id 的最新外观。 有什么想法吗?

CREATE TABLE IF NOT EXISTS table (
  item_id varchar(30) NOT NULL,
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  ...
  PRIMARY KEY  (item_id, ts)
);

【问题讨论】:

【参考方案1】:

你的意思是MAX()

SELECT item_id, MAX(ts) as TS
FROM `table`
GROUP BY item_id

但是,如果您想从最新的item_id 获取所有列,您可以将此查询放在子查询中并将其连接到表本身:

SELECT  a.*
FROM    `table` a
        INNER JOIN
        (
            SELECT item_id, MAX(ts) as TS
            FROM `table`
            GROUP BY item_id
        ) b ON a.item_id = b.item_id
                AND a.ts = b.TS

【讨论】:

这个内连接查询与普通的 where with in 子查询有什么不同?有性能问题吗? select * from table a where a.id, a.ts in (select id, max(ts) from table b group by id)【参考方案2】:

您可以将 item_id 传递给变量或将其直接设置到查询中,只要您有包含这两个字段的表的索引,查询优化器就会利用它并为您提供 item_id 的最新记录:

SET @ID := 10;
SELECT item_id, ts 
FROM table 
WHERE item_id = @ID
ORDER BY item_id,ts DESC
LIMIT 1

【讨论】:

使用 Min、Max 函数明确要求进行全表或全索引扫描,这不是最优的。它仅用于 SQL 变体之间的可移植性。

以上是关于使用共享主键检索mysql中的最后一行的主要内容,如果未能解决你的问题,请参考以下文章

MySQL:在没有 auto_increment 的情况下获取最后插入的主键

mysql表中一个表中可以有多个主键吗?

根据最后一个自动增量主键检索记录并在输入字段中查看

如何在 Spring Boot 中使用复合主键从 MySql 中检索数据

如何从 aspx 中的 Gridview 行中检索主键以在 userControl.ascx 中使用?

mysql表中一个表中可以有多个主键吗