php mysql替代在循环中再次使用相同的查询[重复]

Posted

技术标签:

【中文标题】php mysql替代在循环中再次使用相同的查询[重复]【英文标题】:php mysql alternative to using same query again inside a loop [duplicate] 【发布时间】:2012-11-29 19:31:55 【问题描述】:

可能重复:Is it possible to query a tree structure table in mysql in a single query, to any depth?

我创建了一个管理区域,它使用 php 从 mysql 数据库中提取数据并将结果显示在表格中。基本上它显示一个父类别,然后是它下面的第一个子类别,然后是第三级子类别/主题。

它运行良好,但由于我是 mysql 和 php 的新手,我确信代码需要改进以节省数据库资源,因为在构建表时我使用 3 个 while 循环,并且在每个循环中进行 mysql 查询我敢肯定这是错误的做法。

有人可以为我提供一些帮助以找到最好的方法吗?

代码如下:

           $query = mysql_query("SELECT * FROM categories WHERE
parent_id is null
order by cat_id asc;", $hd)
or die ("Unable to run query");       

while ($row = mysql_fetch_assoc($query)) 
echo '<tr style="font-weight:bold;color:green;"><td>'. $row    ['cat_id'].'</td><td>'.$row['cat_name'].'</td><td>'.$row    ['parent_id'].'</td><td>'.$row['active'].'</td><td>'.$row    ['url'].'</td><td>'.$row['date_updated'].'</td></tr>' ;

$query2 = mysql_query("SELECT * FROM categories WHERE
                (active = 'true' AND parent_id = ".$row    ['cat_id'].")
                order by cat_id asc;", $hd)
      or die ("Unable to run query");
while ($row2 = mysql_fetch_assoc($query2)) 
echo '<tr style="font-weight:bold;"><td>'. $row2['cat_id'].'</td><td>'.$row2    ['cat_name'].'</td><td>'.$row2['parent_id'].'</td><td>'.$row2    ['active'].'</td><td>'.$row2['url'].'</td><td>'.$row2    ['date_updated'].'</td></tr>' ;
    $query3 = mysql_query("SELECT * FROM categories WHERE
                (active = 'true' AND parent_id = ".$row2    ['cat_id'].")
                order by cat_id asc;", $hd)
      or die ("Unable to run query");
      while ($row3 = mysql_fetch_assoc($query3)) 
echo '<tr><td>'. $row3['cat_id'].'</td><td>'.$row3['cat_name'].'</td><td>'.$row3    ['parent_id'].'</td><td>'.$row3['active'].'</td><td>'.$row3    ['url'].'</td><td>'.$row3['date_updated'].'</td></tr>' ;




编辑

好的,所以我做了一些研究,这就是我所在的位置:

可能对于小型数据库,我的方法很好。

对于使用数组存储数据的更大数据库可能意味着我需要使用递归方法,这可能会占用太多内存。很想听听人们的想法,它是否仍然比在嵌套的 while 循环中循环 db 查询更好?

我找到了以下线程,其中有一个答案可以在没有递归且只有一个查询的情况下执行此操作。不确定是否需要在当前设计中添加位置列: How to build unlimited level of menu through PHP and mysql

如果我使用嵌套集模型而不是邻接模型重建设计,那么 mysql 查询将按所需顺序返回结果,但是维护嵌套集设计超出了我的想象,我认为这太过分了。

就是这样。如果有人对此有任何意见,请添加到对话中。必须有一种成功的方法,因为大量的 Web 应用程序必须需要这种要求。

【问题讨论】:

***.com/questions/169817/… 【参考方案1】:

我认为你可以这样做:

SELECT * FROM categories
WHERE active = 'true'
ORDER BY parent_id, cat_id

这将为您提供按 parent_id 排序的所有类别,然后按 cat_id。然后,您将获取结果集并从中构建一个多维数组。然后,您可以像当前一样循环遍历该数组以输出类别。

虽然从数据库访问的角度来看这更好,但它也会消耗更多内存,因为您需要将这个更大的数组保留在内存中。所以这确实是一个你需要考虑的权衡。

【讨论】:

感谢您的回答,关于数组,我想到了这一点,但也想到了我将使用内存而不是大量查询的事实。【参考方案2】:

那里有很多要解决的问题,但我只会解决您关于减少查询的问题。我建议一起摆脱 WHERE 子句,并在 while 循环中使用 if 语句。使用外部变量来保存与特定条件匹配的所有结果,然后在循环后立即将它们全部回显。像这样的东西(为了简洁起见,我把你的一堆东西放在变量中)

//before loop
$firstInfoSet = '';
$secondInfoSet = '';
$thirdInfoSet = '';

//in while loop

if($parentID == NULL)

  $firstInfoSet.= $yourFirstLineOfhtml;


if($active && $parentID == $catID) // good for query 2 and 3 as they are identical

  $secondInfoSet.= $yourSecondLineOfHtml;
  $thirdInfoSet.= $yourThirdLineOfHtml;


//after loop
echo $firstInfoSet . $secondInfoSet . $thirdInfoSet;

您现在可以创建任何类型的分组,如果需要,可以轻松修改它们,并将结果放在您想要的任何位置。

--编辑-- 在更好地理解问题之后......

$query = mysql_query("SELECT * FROM categories order by cat_id asc;", $hd);
$while ($row = mysql_fetch_assoc($query))
   if($row['parent_id'] == NULL)
      //echo out your desired html from your first query 
   
   if($row['active'] && $row['parent_id']== $row['cat_id'])
      //echo out your desired html from your 2nd and 3rd queries
   

【讨论】:

感谢您的回答,我不确定我是否理解。同样据我所知,当我需要显示父ID时,看起来我只会一个接一个地显示每个信息集,然后在其下显示第一个子猫,然后遍历子猫(第三级)其中,然后当他们结束时检查该 parentID 下是否有更多类别等...不确定是否一次性全部完成? 抱歉,错过了 while 嵌套。只需将回声线放在每个 if 语句中。无需将它们分组。 好的,我想我明白了。所以你是说我应该访问数据库一次然后循环遍历结果?如上所述,这将使用更多内存,而且我需要将它们全部放在一个数组中,因为使用 mysql_fetch_assoc 将不起作用,因为我需要继续在行结果中上下移动。也许我理解错了? 您已经在结果中循环了三遍。这样,您只需循环一次。见编辑 谢谢,如果我只有 2 个级别,这似乎可以工作,但是在执行三个级别时,即使在循环之前运行三个不同的查询,我仍然无法使其工作。如果没有循环,我根本无法让它工作......你确定你的建议应该工作吗?如果您有耐心看一下,我可以发布我更新的代码:)

以上是关于php mysql替代在循环中再次使用相同的查询[重复]的主要内容,如果未能解决你的问题,请参考以下文章

相同限制的 MySQL SELECT 查询越来越慢

在 PHP While 循环中使用 MySQL JOIN 而不是查询

PHP / MYSQL:如何在while循环中循环来自查询的匹配结果

PHP中的子查询

一个 SQL 查询,还是一个循环中的多个?

PHP MySQL 相同的查询返回不同的行数