Reputation: 776
Two tables. Table one is users. Table two is user events. One user has many events. I just want to get a list of the users with the most recent events. I can obviously set it to select more rows than I need and filter out the duplicates but I really want to just select the exact number of rows I need in the SQL.
This SQL query gives duplicates of a.name
where one user has had more than one event recently. I thought that DISTINCT
would prevent duplicates. What am I doing wrong? How do I just get one row for each user?
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;
Table users...
id name
Table events...
id userid date
I don't need to select the b.date
value but this is needed for DISTINCT
to work because it is in the ORDER BY
part, I believe.
Upvotes: 0
Views: 51
Reputation: 37527
You could GROUP BY
the user and only take the maximum date
(or the minimum, if you want the oldest of the events).
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
won't help you, when there are different date
values for a user. Those records are distinct because of the different date
values, though sharing a user.
Upvotes: 1