选择LEFT JOIN中的最大行

时间:2011-04-26 18:36:11

标签: php mysql join left-join

我有一个SQL查询,LEFT将一个表加入其中。这会导致主表中的行重复,但与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为我做这个吗?

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

编辑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

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:1)

像这样:

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

您可以使用GROUP BY对某些值进行分组,但必须对选择列表中的所有值进行分组,除非它是聚合函数< / em>,例如MAX