我有一个名为'user_log'的表,它有以下字段:
感谢您的帮助 :)
- id
- user_id
- status_text
- timestamp
感谢您的帮助 :)
假设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
在'on clause'中未知的列'last_udpates.user_id'
。 - Mark Byers使用:
SELECT ul.user_id,
MAX(ul.timestamp)
FROM USER_LOG ul
GROUP BY ul.user_id
相关子查询可用于获取具有最新时间戳的记录的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)
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
结果:
1, 1, 'Foo', '2010-01-01 00:00'
4, 2, 'Bar', '2010-01-01 01:00'
测试数据:
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 user_id, MAX(timestamp) FROM user_log GROUP BY user_id
这是 n-n 关系吗?如果不是,根据标准指南,状态文本和时间戳应被最大的表格吸收。
如果不是,请尝试
SELECT id,MAX(timestamp) FROM user_log GROUP BY user_id;
status_text
,只是想要每个用户的最新记录...此外,他可以自己添加所需的字段,这不是一个复制/粘贴解决方案网站,你不能为你的项目得到黑白答案。 - Ben