我需要连接三个表,将结果按一列分组,并显示另一列的最大值
Posted
技术标签:
【中文标题】我需要连接三个表,将结果按一列分组,并显示另一列的最大值【英文标题】:I need to join three tables, group the results by one column, and display the highest value from another column 【发布时间】:2012-12-16 12:00:06 【问题描述】:假设我有三张桌子:
users
带有名称 ID
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 -- 实际数据库与此不完全相同,但问题相同。
【问题讨论】:
【参考方案1】: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
SQLFiddle Demo
【讨论】:
嗨,这完全符合 JSFiddle 的要求,谢谢。但奇怪的是,它在我的本地设置、客户端和服务器 5.1.44 上都没有按预期工作。无论如何,我有这个想法。 你在本地机器上得到了什么结果? 我得到了重复。正确的四个结果以正确的顺序出现,但随后它们又出现了。但它适用于生产服务器,不同版本的 mysql。 添加DISTINCT
,例如SELECT DISTINCT a.*, b.*, c.* ....
。我猜你的表格消息中有重复的行。
那行得通。非常感谢。知道为什么旧版本的 MySQL 会这样吗?以上是关于我需要连接三个表,将结果按一列分组,并显示另一列的最大值的主要内容,如果未能解决你的问题,请参考以下文章