Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/253.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_Sql - Fatal编程技术网

Php 使用多个值的内部联接查询

Php 使用多个值的内部联接查询,php,mysql,sql,Php,Mysql,Sql,我的表格结构如图所示: table:App |AppID|AppName|AppType| 1 test new table:AppRelease |AppReleaseID|AppID|ReleaseDate|ReleaseVersion| 1 1 2012-06-20 2.2 2 1 2012-06-19 2.3 我编写了一个查询,如下所示: SELECT A.*,B.Rele

我的表格结构如图所示:

table:App
|AppID|AppName|AppType|
   1    test     new

table:AppRelease
|AppReleaseID|AppID|ReleaseDate|ReleaseVersion|
   1            1   2012-06-20        2.2
   2            1   2012-06-19        2.3
我编写了一个查询,如下所示:

SELECT A.*,B.ReleaseDate,B.ReleaseVersion 
FROM App as A 
  LEFT JOIN AppRelease as B ON A.AppID=B.AppID

此查询用于AppRelease表中的单个值,但AppRelease表中的多个值我希望获得最后一个附加值。在单个查询中是否可能?

要在单个查询中实现这一点,您需要在子查询中首先获得最大值:

SELECT A.*,B.ReleaseDate,B.ReleaseVersion 
FROM App as A 
    LEFT JOIN AppRelease as B ON A.AppID = B.AppI
WHERE B.ReleaseDate = (
    SELECT MAX(ReleaseDate)
    FROM AppRelease
    WHERE AppID = A.AppID GROUP BY AppID
    LIMIT 0, 1
) OR B.ReleaseDate IS NULL;

我认为还有另一种方法可以做到这一点,即使用子查询作为联接表。

使用联接我认为最好的方法是从AppRelease中选择最大值

SELECT A.*,MAX(B.ReleaseDate),MAX(B.ReleaseVersion)
FROM App as A
LEFT JOIN AppRelease as B ON A.AppID=B.AppID
GROUP BY A.AppID
如果希望从语义上获取最后一个附加值,那么最好使用子查询,例如

SELECT A.*,
(SELECT B.ReleaseDate FROM AppRelease as B
WHERE B.AppID=A.AppID ORDER BY B.AppReleaseID DESC LIMIT 1)
as ReleaseDate,
(SELECT B.ReleaseVersion FROM AppRelease as
B WHERE B.AppID=A.AppID ORDER BY B.AppReleaseID DESC LIMIT 1)
as ReleaseVersion
FROM App as A

fiddle:

如果您需要“最后附加值”,您应该尝试在B.ReleaseDateAnswer added之前在最终订单中添加。请告诉我它是否有效。我现在正在添加一个sqlfiddle,还记得@FahimParkar先生以前的建议…@Sebas:我不是先生,我只是一个初学者。:)@Sebas:若表很小或者OP提供了输入,你们也可以提供SQLFIDLE。很容易理解OP,尤其是其他的。不幸的是,sqlfiddle说having子句是不正确的(unknown column releasedate),这真的无法解释。为你们添加链接到check@Sebas我还没有测试它,在您发表评论时,我没有指定WHERE/GROUP子句,因此它没有获得正确的值。但除此之外,还有另一个不起作用的原因吗?既然您在子查询中按appid进行了筛选,这就是不起作用的原因之一。但是,您仍然在表B上添加了一个包含性筛选器,它隐式地将左连接转换为内部连接。第二个选项不是被db引擎优化得更少吗?我想是的。正如我所说,这更多的是一个语义问题。第一个查询更简单,可以完成任务,但从技术上讲,它并没有得到最后的附加值,而是得到了最大的价值。它们在Suresh的表中具有相同的结果,但这只是因为设计的表结构具有不断增加的值。我的意思是,在联接子句中调用的子查询只运行一次,在WHERE子句中调用的子查询每行调用一次,那些被称为列值的值每行被调用一次,乘以通过子查询构造的列值的数量。-与此相比。我删除了最里面的having子句,因为我不确定这是否有意义(mysql对此表示不满)。这个版本不行吗?HAVE将确保提取的日期是最后一个。在您的版本中,返回的都是wronmghmm,经过思考后,结果是相同的,但内部计算却不相同。许多行被分组并提取最大值,每次都相同。在我的版本中,只返回最大值的行,这可能更快。但现在我什么都不确定了……你在跟踪我还是什么?:-)有趣的是,我想我今天可以给你留个信息,关于这件事,我不是在关注你——只是在关注人们如何使用我的网站:)尤其是当网站可能出现问题时(我想这里可能就是这种情况),我的耳朵会特别兴奋。现在我认为您使用的having子句语法是不正确的。
SELECT aa.*, bb.AppReleaseID, bb.ReleaseDate
FROM App aa LEFT JOIN (
            SELECT a.AppID, a.AppReleaseID, a.ReleaseDate
            FROM AppRelease a INNER JOIN (
                        SELECT AppID, MAX(ReleaseDate) mx FROM AppRelease 
                        GROUP BY AppID
                    ) b ON a.AppID = b.AppID AND a.ReleaseDate = b.mx
        ) bb ON bb.AppID = aa.AppID