MySQL:如何为每个用户只选择最后一次更新?
假设我有一个带有以下字段的“用户日志”表:MySQL:如何为每个用户只选择最后一次更新?,sql,mysql,Sql,Mysql,假设我有一个带有以下字段的“用户日志”表: 身份证 用户id 状态文本 时间戳 如何编写只为该表中的所有用户选择上次更新的查询 感谢您的帮助:)假设ID是自动增量ID,您可以执行以下操作: SELECT * FROM user_log INNER JOIN (SELECT MAX(id) as id FROM user_log GROUP BY user_id) last_updates ON last_updates.id = user_log.id 如果您想真正做到学究式的正确
- 身份证
- 用户id
- 状态文本
- 时间戳
感谢您的帮助:)假设ID是自动增量ID,您可以执行以下操作:
SELECT *
FROM user_log
INNER JOIN
(SELECT MAX(id) as id FROM user_log GROUP BY user_id) last_updates
ON last_updates.id = user_log.id
如果您想真正做到学究式的正确,并涵盖所有关键情况(具有相同时间戳的多个更新、无序插入等),您可以使用时间戳:
SELECT *
FROM user_log
INNER JOIN
(SELECT MAX(id)
FROM user_log
INNER JOIN
(SELECT DISTINCT user_id, MAX(timestamp) as timestamp
FROM user_log GROUP BY user_id
) last_updates
ON last_updates.user_id = user_log.user_id
AND last_updates.timestamp = user_log.timestamp
) last_update
ON last_update.id = user_log.id
使用:
尝试:
SELECT user_id, MAX(timestamp) FROM user_log GROUP BY user_id
这是n-n关系吗?如果不是,根据标准指南,状态文本和时间戳应该被关系中最大的表吸收 如果不尝试
SELECT id,MAX(timestamp) FROM user_log GROUP BY user_id;
如果您对
(user\u id,timestamp)
没有唯一的约束,但仍然希望保证每个用户只返回一行,则可以使用此查询:
SELECT id, user_id, status_text, timestamp
FROM (
SELECT *, @prev <> user_id AS is_newest, @prev := user_id
FROM user_log, (SELECT @prev := -1) AS vars
ORDER BY user_id, timestamp DESC, id DESC
) AS T1
WHERE is_newest
测试数据:
CREATE TABLE user_log (id INT NOT NULL, user_id INT NOT NULL, status_text NVARCHAR(100) NOT NULL, timestamp NVARCHAR(100) NOT NULL);
INSERT INTO user_log (id, user_id, status_text, timestamp) VALUES
(1, 1, 'Foo', '2010-01-01 00:00'),
(2, 1, 'Bar', '2010-01-01 00:00'),
(3, 2, 'Foo', '2010-01-01 00:00'),
(4, 2, 'Bar', '2010-01-01 01:00');
相关子查询可用于获取具有最新时间戳的记录的id。即使时间戳不是唯一的,或者id不是按顺序给出的,这也应该有效
select
ul.id,
ul.user_id,
ul.status_text,
ul.timestamp
from
user_log ul
where
ul.id = (select top 1 ul2.id
from user_log ul2
where ul2.user_id = ul.user_id
order by ul2.timestamp desc)
是否只需要用户id和日期,或任何支持行?是否对用户id和时间戳有唯一的约束?您的第二个查询会出现以下错误:
未知列“last\u udpates.user\u id”在“on子句”
@Mark-抱歉,是一个打字错误。”“最后更新”应该是“最后更新”。现已修复。这将获取每个用户的最新时间戳,但不能保证返回OP想要的最新状态文本。这将获取每个用户的最新时间戳,但不能保证返回OP想要的最新状态文本。@michael OP从未声明他想要获取状态文本
,只是每个用户的最新记录。。。此外,他可以找到添加他需要的字段的方法,这不是一个复制/粘贴解决方案站点,您可以从中获得项目的黑白答案。
CREATE TABLE user_log (id INT NOT NULL, user_id INT NOT NULL, status_text NVARCHAR(100) NOT NULL, timestamp NVARCHAR(100) NOT NULL);
INSERT INTO user_log (id, user_id, status_text, timestamp) VALUES
(1, 1, 'Foo', '2010-01-01 00:00'),
(2, 1, 'Bar', '2010-01-01 00:00'),
(3, 2, 'Foo', '2010-01-01 00:00'),
(4, 2, 'Bar', '2010-01-01 01:00');
select
ul.id,
ul.user_id,
ul.status_text,
ul.timestamp
from
user_log ul
where
ul.id = (select top 1 ul2.id
from user_log ul2
where ul2.user_id = ul.user_id
order by ul2.timestamp desc)