Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从左连接中选择最大的行_Php_Mysql_Join_Left Join - Fatal编程技术网

Php 从左连接中选择最大的行

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

我有一个SQL查询,它将一个表左键连接到其中。这会导致主表中的行被复制,但与联接表中的行不同。如何仅从联接表中选择日期最高的行

下面是一个示例(这是我查询的结果):

我希望每个ID一行,ID最高的一行

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来解决它