php - 从 LEFT JOIN 中选择最大的行

标签 php mysql join left-join

我有一个 SQL 查询,它通过 LEFT JOIN 将一个表加入其中。这会导致主表中的行被复制,但与 JOINed 表中的行不同。如何仅从 JOINed 表中选择具有最高日期的行。

这是一个例子(这是我查询的结果):

ID    Message    Date
---------------------------
0     Hi         2011-01-01
0     Bye        2011-02-05
0     Hello      2011-04-20
1     Test       2010-12-31
1     Testing    2010-11-15
2     Something  2010-12-12
2     Nothing    2011-01-01
2     Yes        2010-02-05
3     Cool       NULL

我想要每个 ID 一行,具有最高 ID 的行。

ID    Message    Date
---------------------------
0     Hello      2011-04-20
1     Test       2010-12-31
2     Nothing    2011-01-01
3     Cool       NULL

我当前的查询是这样的(我只是编造的,但它与真实查询类似):

SELECT t1.ID, t2.Message, t2.Date
FROM t1
LEFT JOIN (
  SELECT t3.ID, t3.message, t3.Date
  FROM t3
  LEFT JOIN t4 ON t4.userID = 12 AND t3.ID = t4.ID
  WHERE t4.color = 'blue'
) AS t2
ON t1.ID = t2.ID
WHERE t1.userID = 12

我想我可以使用 PHP 循环遍历结果并挑选出我想要的结果,但我可以让 MySQL 帮我做这些吗?

编辑:抱歉,我的第一个例子是方式错误的,这更像是我想要的。

编辑 2:我尝试使用 GROUP BY 和 MAX,但我认为我做错了什么。

我试过:

SELECT t1.ID, t2.Message, MAX(t2.Date)
FROM t1
LEFT JOIN (
  SELECT t3.ID, t3.message, t3.Date
  FROM t3
  LEFT JOIN t4 ON t4.userID = 12 AND t3.ID = t4.ID
  WHERE t4.color = 'blue'
) AS t2
ON t1.ID = t2.ID
WHERE t1.userID = 12
GROUP BY t1.ID

但是,这给了我:

ID    Message    Date
---------------------------
0     Hi         2011-04-20
1     Test       2010-12-31
2     Something  2011-01-01
3     Cool       NULL

如何获取与最高日期关联的消息。

最佳答案

Select t1.id, t1.Message, t3.date
From t1
    Left Join t3
        On t3.id = t1.id
            And t3.id = (
                        Select Max( t3_1.Id )
                        From t3 As t3_1
                        Where t3_1.id = t3.id
                        Having Max( t3_1.date ) = t3.date
                        )
Where t1.userID = 12

据我所知,t4 的连接在查询中没有任何作用。它不会过滤结果,也不会在 Select 子句中显示 t4 表中的任何内容。此外,我假设 t3.id 列实际上是 t1 表的外键,而不是主键。如果它是主键,则不需要其他最大日期过滤器。


更新给定的问题修订

通过向 t4 的 Where 子句添加条件,您已有效地将其转换为内部联接。不过,一种解决方案是:

Select t1.id, t3.Message, t3.date
From t1
    Left Join t3
        On t3.id = t1.id
            And t3.id = (
                        Select Max( t3_1.Id )
                        From t3 As t3_1
                            Join t4
                                On t4.id = t3_1.id
                        Where t4.color = 'blue'
                            And t3_1.id = t3.id
                        Having Max( t3_1.date ) = t3.date
                        )
Where t1.userID = 12

关于php - 从 LEFT JOIN 中选择最大的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5794865/

相关文章:

php - 将输入从 "GET"发送到 php 中的 xml 文件

php - MySQL 查询的语法错误

php - 如何从mysql数据库中获取刚刚输入的表单数据的id

mysql - 带有一些 JOINS 的 MIN 和 MAX

mysql - 连接 3 个表时遇到问题(表/别名不唯一)

php - 如何使用 jQuery、PHP 和 MySQL 加载 JSON 数据

php - MySQL 连接不上数据库

php - 当我想为 braintree 上的每次点击结账生成 token 时,我遇到了 ssl 证书错误

mysql - 有聚合函数时如何获得最大时间?

ElasticSearch 加入过滤器 : Using subquery results as filter input possible?