使用共享主键检索 mysql 中的最后一行
Retrieve last row in mysql with shared primary key
我有一个 table,主键有 2 个值 - id 和时间戳。
table 包含每个 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)
);
你是说 MAX()
吗?
SELECT item_id, MAX(ts) as TS
FROM `table`
GROUP BY item_id
但是,如果您想要根据最新的 item_id
获取所有列,您可以将此查询放入子查询并将其连接到 table 本身:
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
您可以将 item_id 传递给变量或将其直接设置到查询中,只要您有包含这两个字段的 table 的索引,查询优化器就会使用它并为您提供 item_id:
的最新记录
SET @ID := 10;
SELECT item_id, ts
FROM table
WHERE item_id = @ID
ORDER BY item_id,ts DESC
LIMIT 1
我有一个 table,主键有 2 个值 - id 和时间戳。 table 包含每个 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)
);
你是说 MAX()
吗?
SELECT item_id, MAX(ts) as TS
FROM `table`
GROUP BY item_id
但是,如果您想要根据最新的 item_id
获取所有列,您可以将此查询放入子查询并将其连接到 table 本身:
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
您可以将 item_id 传递给变量或将其直接设置到查询中,只要您有包含这两个字段的 table 的索引,查询优化器就会使用它并为您提供 item_id:
的最新记录SET @ID := 10;
SELECT item_id, ts
FROM table
WHERE item_id = @ID
ORDER BY item_id,ts DESC
LIMIT 1