说我有三张桌子:
>名称为ID的用户
>包含具有电子邮件地址的行的电子邮件
>包含行的消息,其中包含电子邮件的日期和标题
当然,第二个和第三个表都可以使用用户的ID与第一个表匹配.
我想要一个查询,它只返回每个用户一次,他们的电子邮件地址和他们最近的消息的日期.
如果我用这个:
SELECT name,email,title,date
FROM users
JOIN emails ON users.id = emails.user_id
JOIN messages ON messages.user_id = emails.user_id
group by name
order by date desc
我没有收到最新的消息,因为订单发生在加入和分组之后.我从用户那里收到一封电子邮件,电子邮件按日期排序.
这可以在一次加入中完成吗?我错过了什么?
您可以使用的虚拟数据库的Pastebin:http://pastebin.com/1x273aEe – 实际数据库不完全是这样,但它是同样的问题.
解决方法:
SELECT a.*, b.*, c.*
FROM users a
INNER JOIN emails b
ON a.ID = b.user_ID
INNER JOIN messages c
ON a.ID = c.user_ID
INNER JOIN
(
SELECT user_id, MAX(date) maxDate
FROM messages
GROUP BY user_ID
) d ON c.user_ID = d.user_ID AND
c.date = d.maxDate
标签:mysql,join,sql,greatest-n-per-group
来源: https://codeday.me/bug/20190629/1329695.html