2011-06-28 11 views
0

私はちょうどphpとmysqlを始めています。私は自分のデータベースから2つのクエリを持っています。最初に、lifestylesというテーブルを照会し、foreachループを実行してその行の各項目を出力します。これらの行にはそれぞれ、メンバーがコメントを投稿するためのコメントボックスがあります。 commentsテーブルには、ライフスタイル行のpostidという連想カラムがあります。だから、私は、ライフスタイルの各行の下にこれらのコメントを表示するために、前のループ内で別のforeachループを実行しました。 問題は、各コメントが各ライフスタイルクエリの回数だけ複製されることです。 以下を参照してください。mysqlの複数のテーブルからのネストされたforeachループクエリの問題

Title: TEST 

Date: 28th-Jun-2011 at 10:10 PM 

TEST LIFESTYLE POST 

Comments 

TEST COMMENT 

TEST COMMENT 

TEST COMMENT 

TEST COMMENT 

TEST COMMENT 

TEST COMMENT 

TEST COMMENT 

TEST COMMENT 

TEST COMMENT 

TEST COMMENT 

TEST COMMENT 

やコード:私はすべての日にしようとしている

<?php 

     $lifestyles=dbAll("select * from user_accounts, lifestyle where lifestyle.category=1 and lifestyle.user_id=user_accounts.id order by cdate DESC"); 

     if(!$lifestyles){ 
      echo '<em><strong>No Posts yet. Why don\'t you be the first!</strong></em>'; 
     } 
     else{ 

      foreach($lifestyles as $lifestyle){ 
       $lifestyleid=(int)$lifestyle['id']; 
       echo '<form class="postform" method="post" action="shopping.php?redirect='.$_SERVER["PHP_SELF"].'">'; 
       echo '<input type="hidden" name="postshop" value="1" />'; 
       echo '<input type="hidden" name="postid" value="'.$lifestyleid.'" />'; 
       echo '<table class="postinfo"><tr><th>Title:</th><td style="font-weight:bold">'.$lifestyle['title'].'</td> 
       </tr>'; 
       echo '<th>Date:</th><td>'.date('dS-M-Y', strtotime($lifestyle['cdate'])).' at'.' '.date('g:h A', strtotime($lifestyle['cdate'])).'</td> 
       <th>By:</th><td>'.$lifestyle['firstname'].' '.$lifestyle['lastname'].'</td>'; 
       echo '</table>'; 

       echo '<div class="postbody"><table>'; 
       echo '<tr><td>'.$lifestyle['body'].'</td><td></td></tr>'.'</table></div>'; 

       $comments=dbAll("select * from comments,lifestyle where comments.postid=$lifestyleid and section_id=1 order by commentdate DESC"); 

       echo '<div class="comment">'; 
       echo '<table><tr><th>Comments</th></tr>'; 

       **foreach($comments as $comment) 
       { 
        echo '<tr><td>'.$comment['commentbody'].'</td></tr>'; 
       }** 

       echo '<tr><td><textarea rows="1" title="Write a comment" name="comment" placeholder="Write a comment..."></textarea></td></tr>'; 
       echo '</table></div>'; 
       echo '<input type="submit" name="action" value="Save Comment" />'; 
       echo '<hr />'; 
       echo '</form>'; 
      } 

     } 
    ?> 

、助けてください。

+1

このようなループで相関クエリを決してネストしないでください。データベースに接続し、クエリを送信し、結果セットを生成し、その結果セットをアプリケーションに送り返すことは費用がかかります。一度やり直してください。何度もループしないでください。 1つのクエリで3つのテーブルをすべて結合して、「ライフスタイル」とすべての関連する「コメント」をまとめて取得することができます。結果をライフスタイルとコメント日付順に並べ、アプリケーション側のコメントグループごとに1回だけライフスタイルを印刷します。 –

答えて

0

問題は、この行のクエリです:

$comments=dbAll("select * from comments,lifestyle where comments.postid=$lifestyleid and section_id=1 order by commentdate DESC"); 

あなたはライフスタイルのテーブルにコメントテーブルに参加していません。 結合を追加して、クエリを次のように変更してみてください。

select * 
from comments,lifestyle 
where comments.postid=$lifestyleid 
and section_id=1 
---->> 
AND comments.postid = lifestyle.id 
order by commentdate DESC 
+0

ありがとうございました。私はJOINを追加し、すべては魔法のように働いた。しかし、一度に3つのテーブルすべてに参加するようにクエリを修正します。もう一度ありがとう。 – Maurice

+0

この回答を受け入れるのを忘れないでください。それは私たちの評判の両方に役立ちます。 –

関連する問題