0

我有代码:

$somevar=mysql_query("SELECT * FROM feed");
while ($fetched=mysql_fetch_array($somevar)) {

  $nextvar=mysql_query("SELECT FROM comments WHERE feed_id='".$fetched['id']."'");
  while ($anotherfetch=mysql_fetch_array($nextvar)) {
    echo $anotherfetch['comment'];
  }

  echo $fetched['person'].$fetched['text'];
}

表结构:

feed
id | person | text

comments
id | feed_id | person | comment

优化它的最佳解决方案是什么,有可能吗?我知道在一段时间内犯下一个大错误,但看起来没有其他办法。

4

3 回答 3

0

听起来你想要这样的东西:

SELECT person, 
       comment 
  FROM feed f 
         INNER JOIN comments c 
         ON f.id = c.feed_id
于 2012-11-20T20:02:24.120 回答
0

awhile中的Awhile与其说是嵌套查询的问题,不如说是问题。这通常表明存在N+1 问题

虽然有不同的解决方案,但我对您的建议是使用 aJOIN并根据需要将数据拼接在一起。

此外,如评论中所述,请不要使用这些mysql_*功能,因为它们处于弃用过程中。改用MySQLiPDO成为更好的 PHP 开发人员

于 2012-11-20T19:45:14.327 回答
0

这通常是一个坏习惯,在循环内部运行N个查询,循环执行的次数取决于外部查询返回的行数。风险是外部查询返回 1000 行,然后你的代码执行 1000 次内部查询,这有很大的开销。

还有一个问题是 MySQL 不允许客户端在外部查询仍在进行中时执行新查询。也就是说,外部查询仍然有结果要返回。解决方法是由 PHP mysql 客户端透明地完成,它在内部已经从外部查询中获取了所有结果。调用mysql_fetch_array()实际上只是迭代它已获取并保存在内存中的数据。

您应该学习如何使用JOIN查询来避免这种反模式。

于 2012-11-20T19:45:25.880 回答