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)