我有代码:
$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
优化它的最佳解决方案是什么?它有可能吗?我知道在进行的同时制作是一个很大的错误,但看起来没有别的办法......
答案 0 :(得分:0)
while
中的while
不是嵌套查询的问题。这通常表示N + 1 problem。
虽然有different solutions,但我的建议是使用JOIN
并根据需要将数据拼接在一起。
另外,如评论中所述,请不要使用deprecation process中的mysql_*
函数。请改为使用MySQLi或PDO和be 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