Mysql同时在mysql中 - 优化

时间:2012-11-20 19:34:03

标签: php mysql

我有代码:

$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

优化它的最佳解决方案是什么?它有可能吗?我知道在进行的同时制作是一个很大的错误,但看起来没有别的办法......

3 个答案:

答案 0 :(得分:0)

while中的while不是嵌套查询的问题。这通常表示N + 1 problem

虽然有different solutions,但我的建议是使用JOIN并根据需要将数据拼接在一起。

另外,如评论中所述,请不要使用deprecation process中的mysql_*函数。请改为使用MySQLiPDObe a better PHP Developer

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

SELECT person, 
       comment 
  FROM feed f 
         INNER JOIN comments c 
         ON f.id = c.feed_id