我有一个 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/