Php 从左连接中选择最大的行
我有一个SQL查询,它将一个表左键连接到其中。这会导致主表中的行被复制,但与联接表中的行不同。如何仅从联接表中选择日期最高的行 下面是一个示例(这是我查询的结果): 我希望每个ID一行,ID最高的一行Php 从左连接中选择最大的行,php,mysql,join,left-join,Php,Mysql,Join,Left Join,我有一个SQL查询,它将一个表左键连接到其中。这会导致主表中的行被复制,但与联接表中的行不同。如何仅从联接表中选择日期最高的行 下面是一个示例(这是我查询的结果): 我希望每个ID一行,ID最高的一行 ID Message Date --------------------------- 0 Hello 2011-04-20 1 Test 2010-12-31 2 Nothing 2011-01-01 3 Cool
ID Message Date
---------------------------
0 Hello 2011-04-20
1 Test 2010-12-31
2 Nothing 2011-01-01
3 Cool NULL
我当前的查询是这样的(我只是编造了这个,但它与真实的查询类似):
我想我可以使用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,
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
您可以使用groupby
对某些值进行分组,但您必须对选择列表中的所有值进行分组,除非它是一个聚合函数,如MAX
,如下所示:
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
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
您可以使用groupby
对某些值进行分组,但必须对选择列表中的所有值进行分组,除非它是聚合函数,如MAX
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
表的外键,而不是主键。如果它是主键,则不需要max date的其他筛选器
更新给定问题修订版 通过向
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
据我所知,到t4
的连接在查询中没有任何作用。它不会过滤结果,Select子句中也不会显示t4
表中的任何内容。此外,我假设列t3.id
实际上是t1
表的外键,而不是主键。如果它是主键,则不需要max date的其他筛选器
更新给定问题修订版 通过向
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
在内部查询中,在Id上放置一个group by并选择max date…我很难遵循这个示例,但看起来您的思路是正确的。可能需要更长的帖子,但是你能把一些表结构/示例数据放在一起吗?@Rocket-是t3的主键还是t1表的外键?如果我读对了这个查询,那么对于t1表中的0 Id,我们有3条不同的消息?@Rocket-是,但一个名为
ID
的列是外键而不是主键这一点并不直观。我对该场景的第一个想法是,t1
和t3
之间存在1:1的关系,而不是1:Many。在内部查询中,在Id上放置一个group by并选择max date…我很难按照示例进行操作,但看起来您的思路是正确的。可能需要更长的帖子,但是你能把一些表结构/示例数据放在一起吗?@Rocket-是t3的主键还是t1表的外键?如果我读对了这个查询,那么对于t1表中的0 Id,我们有3条不同的消息?@Rocket-是,但一个名为ID
的列是外键而不是主键这一点并不直观。我对这个场景的第一个想法是,t1
和t3
之间有1:1的关系,而不是1:多。现在检查问题,我完全写错了,这个例子更像我现在想要的。现在检查问题,我完全写错了,这个例子更像我现在想要的。谢谢,这确实有效,但我意识到我的问题是错的。我修正了我的例子,所以这不再有效。我实际上通过在子查询库中使用GROUP by和ORDER by来解决它,这确实有效,但我意识到我的问题是错误的。我修复了我的示例,所以这不再有效。我实际上通过在子查询中使用GROUP by和ORDER by来解决它