说我有三张桌子:
users
emails
包含具有电子邮件地址的行messages
包含包含其电子邮件日期和标题的行当然,第二和第三个表都可以使用用户的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 - 实际的数据库并不完全像这样,但它也是同样的问题。
答案 0 :(得分:3)
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