Php 获取数组的while循环中回显行的错误星座

Php 获取数组的while循环中回显行的错误星座,php,mysql,Php,Mysql,我有一个关于mysql_fetch_数组的while循环中回响行的错误星座的问题 请记住,这是一个旧环境,不能使用mysqli 在第一步中,通过mysql查询获得三行: $row1=数组; 而$row=mysql\u fetch\u assoc$aid\u query{ $row1[]=$row['aid'];} $det_query=mysql_query选择det1.baseData作为det11,det2.baseData作为det22,det3.baseData作为det33 从xy中选

我有一个关于mysql_fetch_数组的while循环中回响行的错误星座的问题

请记住,这是一个旧环境,不能使用mysqli

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

$row1=数组; 而$row=mysql\u fetch\u assoc$aid\u query{ $row1[]=$row['aid'];} $det_query=mysql_query选择det1.baseData作为det11,det2.baseData作为det22,det3.baseData作为det33 从xy中选择baseData,其中z='20'并辅助输入。内爆,,$row1。作为第1条, 从xy中选择baseData,其中z='25'并辅助输入。内爆,,$row1。如第2条所述, 从xy中选择baseData,其中z='40'并辅助输入。内爆,,$row1。第3条 ; 在第二步中,应重复结果:

而$row2=mysql\u fetch\u数组$det\u query{ echo$row2['det11'].从:.$row2['det22']到:.$row2['det33'].lorem ipsum; 回响 } 这就是问题所在。 根据与$aid_查询id相关的选择,第一步中的$aid_查询或更确切地说$row1包含五个不同的选项,例如500、503等。。 因此,行det11、det22和det33各包含五个值。 但不是像这样重复五行

det11[第一值]、det22[第一值]、det33[第一值] det11[第二值]、det22[第二值]、det33[第二值] 等等,它用所有可能的编译响应了25个场景。 这意味着,每一行的所有五个值都与另一行的所有五个值组合在一起。 例如:

  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
det11[第一个值]det22[第一个值]det33[第一个值] det11[第二值]det22[第一值]det33[第一值] det11[第三值]det22[第一值]det33[第一值] det11[第四值]det22[第一值]det33[第一值] det11[第五值]det22[第一值]det33[第一值] det11[第一值]det22[第二值]det33[第一值] det11[第二值]det22[第二值]det33[第一值] det11[第三值]det22[第二值]det33[第一值] det11[第四值]det22[第二值]det33[第一值] det11[第五值]det22[第二值]det33[第一值] ... det11[第一值]det22[第一值]det33[第五值] det11[第二值]det22[第一值]det33[第五值] det11[第三值]det22[第一值]det33[第五值] det11[第四值]det22[第一值]det33[第五值] det11[第五值]det22[第一值]det33[第五值] ... 如果有人能理解并解释错误,我将不胜感激。
我认为这与第一步的查询有关,我尝试了UNION和JOIN,但没有什么不同。

我认为PHP没有问题

问题是查询。。。它将返回我们期望的结果,因为查询将生成从三个内联视图det1、det2、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和det3分别返回m、n和o行,则查询返回的行总数将是m、n和o的乘积。或者,5x5x5=125

这是预期的行为

您希望返回什么结果集

我希望您希望这些行在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行

如果aid列表中有5个值,并且希望返回5行,则需要以稍微不同的方式编写查询。您可以将该值数组内爆为内联视图。假设aid,z在xy中是唯一的

大概是这样的:

  SELECT det1.baseData AS det11
       , det2.baseData AS det22
       , det3.baseData AS det33
    FROM ( SELECT '500' AS aid 
           UNION ALL SELECT '503'
           UNION ALL SELECT '505'
           UNION ALL SELECT '507'
           UNION ALL SELECT '509'
         ) q
    LEFT
    JOIN xy det1 ON det1.aid = q.aid AND det1.z = '20'
    LEFT
    JOIN xy det2 ON det2.aid = q.aid AND det2.z = '25'
    LEFT
    JOIN xy det3 ON det3.aid = q.aid AND det3.z = '40'
   ORDER BY q.aid

你能创建一个sqlfiddle并忽略php吗