如何仅通过JOIN查询获取DISTINCT行:MySQL

时间:2018-08-11 19:49:15

标签: mysql sql mysqli

两个表。表一是用户。表二是用户事件。一个用户有很多事件。我只想获取具有最新事件的用户列表。显然,我可以将其设置为选择比我需要的行更多的行,并过滤掉重复项,但我真的想只选择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部分。

1 个答案:

答案 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值不同。