我有一个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
如何获取与最高日期相关联的消息。
答案 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
。