我需要连接三个表,将结果按一列分组,并显示另一列的最大值

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 会这样吗?

以上是关于我需要连接三个表,将结果按一列分组,并显示另一列的最大值的主要内容,如果未能解决你的问题,请参考以下文章

如何按一列的最大值获取SQL行,按另一列分组

按一列分组并在熊猫中找到另一列的总和和最大值

新的滚动平均值列,按一列分组并找到另一列的滚动平均值

Python:如何按一列分组行并按另一列选择一行?

Hive Query 在 Select 中具有多列并按一列分组

我需要按一列分组并显示一个数据集中的更多列