两个表。表一是用户。表二是用户事件。一个用户有很多事件。我只想获取具有最新事件的用户列表。显然,我可以将其设置为选择比我需要的行更多的行,并过滤掉重复项,但我真的想只选择SQL中需要的确切行数。
此SQL查询提供a.name
的重复项,其中一个用户最近发生了多个事件。我认为DISTINCT
将防止重复。我究竟做错了什么?我如何为每个用户获得一行?
SELECT DISTINCT (a.name), b.date , a.id
FROM `users` a
INNER JOIN events b
ON a.id = b.userid
WHERE now() > b.date
ORDER BY b.date DESC, a.id DESC
LIMIT 30;
表用户...
id name
表事件...
id userid date
我不需要选择b.date
值,但这是DISTINCT
正常工作所必需的,因为我认为它位于ORDER BY
部分。
答案 0 :(得分:1)
您可以GROUP BY
个用户,并且只获取最大的date
(如果希望事件中最早的事件,则取最小值)。
SELECT a.name,
max(b.date) date,
a.id
FROM users a
INNER JOIN events b
ON a.id = b.userid
WHERE now() > b.date
GROUP BY a.id,
a.name
ORDER BY max(b.date) DESC,
a.id DESC
LIMIT 30;
如果用户的DISTINCT
值不同,则 date
将无济于事。这些记录是不同的,因为尽管共享了一个用户,但它们的date
值不同。