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

while内のaはwhile、ネストされたクエリほど問題ではありません。これは多くの場合、N+1の問題を示しています。

さまざまな解決策がありますが、あなたの場合の私の提案は、を使用して、JOIN必要に応じてデータをつなぎ合わせることです。

また、コメントに記載されているように、非推奨プロセスmysql_*の関数を使用しないでください。代わりにMySQLiまたはPDOを使用して、より優れたPHP開発者になりましょう。

于 2012-11-20T19:45:14.327 に答える
0

これは一般に、ループ内でN個のクエリを実行するのは悪い習慣であり、ループが実行される回数は、外部クエリによって返される行の数によって異なります。リスクは、外部クエリが1000行を返し、コードが1000の内部クエリを実行することです。これには多くのオーバーヘッドがあります。

また、外部クエリの進行中にMySQLがクライアントに新しいクエリの実行を許可しないという問題もあります。つまり、外部クエリにはまだ返される結果があります。PHP mysqlクライアントによって透過的に実行される回避策は、内部的には外部クエリからすべての結果をすでにフェッチしていることです。の呼び出しmysql_fetch_array()は、実際には、フェッチしてメモリに保持しているデータを反復処理するだけです。

JOINこのアンチパターンを回避するためにクエリを使用する方法を学ぶ必要があります。

于 2012-11-20T19:45:25.880 に答える
0

次のようなものが必要なようです。

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