带有取出数组的while循环中错误的回显行星座

时间:2015-06-17 22:44:29

标签: php mysql

我遇到一个问题,即在带有mysql_fetch_array的while循环中错误的回显行星座。

请注意,这是一个古老的环境,mysqli无法使用。

在第一步中,mysql查询获得了三行:

$row1 = array();
while ($row = mysql_fetch_assoc($aid_query)) {
    $row1[] = $row['aid'];}
$det_query = mysql_query("SELECT det1.baseData AS det11, det2.baseData AS det22, det3.baseData AS det33
FROM (SELECT baseData FROM xy WHERE z = '20' AND aid IN(". implode(",",$row1). ")) AS det1,
(SELECT baseData FROM xy WHERE z = '25' AND aid IN(". implode(",",$row1). ")) AS det2,
(SELECT baseData FROM xy WHERE z = '40' AND aid IN(". implode(",",$row1). ")) AS det3
");

在第二步中,结果应该得到回应:

while ($row2 = mysql_fetch_array($det_query)) {
echo $row2['det11']." From: ".$row2['det22']." To: ".$row2['det33']." lorem ipsum";
echo '</br>';
}

这就是问题出现的地方 第一步中的$aid_query或更确切$row1包含五个(取决于与$aid_query相关的选择)id(例如500,503等)。
因此,行det11,det22和det33各包含五个值 但不是像

那样回应五行
det11[first value], det22[first value], det33[first value] 
det11[second value], det22[second value], det33[second value]

等,它与所有可能的编辑相呼应 这意味着,每行的所有五个值都与每个其他行的所有五个值相结合 所以,例如:

det11[first value] det22[first value] det33[first value]
det11[second value] det22[first value] det33[first value]
det11[third value] det22[first value] det33[first value]
det11[fourth value] det22[first value] det33[first value]
det11[fifth value] det22[first value] det33[first value]

det11[first value] det22[second value] det33[first value]
det11[second value] det22[second value] det33[first value]
det11[third value] det22[second value] det33[first value]
det11[fourth value] det22[second value] det33[first value]
det11[fifth value] det22[second value] det33[first value]

...

det11[first value] det22[first value] det33[fifth value]
det11[second value] det22[first value] det33[fifth value]
det11[third value] det22[first value] det33[fifth value]
det11[fourth value] det22[first value] det33[fifth value]
det11[fifth value] det22[first value] det33[fifth value]

...

如果有人能理解并解释错误,我将非常感激 我认为它与第一步的查询有关,我尝试使用UNION以及JOIN,但没有出现任何差异。

1 个答案:

答案 0 :(得分:2)

使用PHP没有问题(我可以看到)。

问题是查询...它返回了我们期望的结果,因为查询生成了从三个内联视图(det1det2,{{返回的行的笛卡尔积。 1}})。

您的查询使用旧式逗号语法进行连接操作,但没有连接谓词(条件)限制哪些行与哪些行匹配。

也就是说,您的查询执行的格式为CROSS JOIN操作:

det3

如果 SELECT det1.baseData AS det11 , det2.baseData AS det22 , det3.baseData AS det33 FROM ( SELECT baseData FROM xy WHERE z = '20' AND aid IN (,,,) ) det1 CROSS JOIN ( SELECT baseData FROM xy WHERE z = '25' AND aid IN (,,,) ) det2 CROSS JOIN ( SELECT baseData FROM xy WHERE z = '40' AND aid IN (,,,) ) det3 det1det2分别返回 m n o 行,查询返回的总行数将是 m n o 的乘积。或者,5 x 5 x 5 = 125。

这是预期的行为。

您希望返回什么结果集?

我希望您希望在det3值上匹配行。对查询的快速(但可能不完整)修复是添加aid值的匹配。

例如:

aid

我说“修复”可能不完整,因为如果任何内联视图中的 SELECT det1.baseData AS det11 , det2.baseData AS det22 , det3.baseData AS det33 FROM ( SELECT aid, baseData FROM xy WHERE z = '20' AND aid IN (,,,) ) det1 JOIN ( SELECT aid, baseData FROM xy WHERE z = '25' AND aid IN (,,,) ) det2 ON det2.aid = det1.aid JOIN ( SELECT aid, baseData FROM xy WHERE z = '40' AND aid IN (,,,) ) det3 ON det3.aid = det1.aid 的特定值“缺失”,则该查询不会为该aid返回一行

即如果行aid存在,但匹配的行aid=500,z=20 存在,则查询不会返回aid=500,z=40行,因为内连接操作。

如果aid=500列表中有5个值,并且要返回5行,则需要稍微区别地编写查询。您可以将该数组值“内爆”到内联视图中。假设aid中的(aid,z)是唯一的......

这样的事情:

xy