我遇到一个问题,即在带有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
,但没有出现任何差异。
答案 0 :(得分:2)
使用PHP没有问题(我可以看到)。
问题是查询...它返回了我们期望的结果,因为查询生成了从三个内联视图(det1
,det2
,{{返回的行的笛卡尔积。 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
,det1
和det2
分别返回 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