2016-02-29 106 views
-2

我有4個表格:用戶,帖子,評論和回覆。MYSQL - 多個SELECT語句中的一個查詢

我想進入到用戶配置文件時讓他的帖子,其中posts.user_id = users.user_id和評論,其中comments.post_id = posts.post_id和回覆replies.comment_id = comments.comment_id ..

可以在那裏在同一語句中完成的所有事情或者,我必須在帖子循環內放置一個循環來回復註釋循環中的回覆?

編輯

這裏是我想應用代碼更簡單。這個代碼工作正常,並返回崗位並和它的主人,爲發表評論和它們的主人和每一個意見的答覆和他們的主人.. 但實際上我想用較少的循環做到這一點。

$sql1 = mysql_query("SELECT * FROM posts WHERE 1"); 
while($row1=mysql_fetch_array($sql1)) 
    { 
    $post_id=$row1['post_id']; 
    $user = $row1['user_id']; 
    $sql11 = mysql_query("SELECT * FROM user WHERE user_id=$user"); 
     while($row11=mysql_fetch_array($sql11)) 
      { 
       $username=$row11['user_name']; 
      } 
    echo("..post BY ". $username ."<br>"); 

    $sql2 = mysql_query("SELECT * FROM comments WHERE post_id=$post_id"); 
    while($row2=mysql_fetch_array($sql2)) 
    { 
      $comment_id=$row2['comment_id']; 
      $comment_user=$row2['user_id']; 
       $sql21 = mysql_query("SELECT * FROM user WHERE user_id=$comment_user"); 
       while($row21=mysql_fetch_array($sql21)) 
       { 
        $com_username=$row21['user_name']; 
       } 
     echo("......comment BY " . $com_username . "<br>"); 

     $sql3 = mysql_query("SELECT * FROM replies WHERE comment_id=$comment_id"); 
     while($row3=mysql_fetch_array($sql3)) 
     { 
       $rep_user=$row3['user_id']; 
       $sql31 = mysql_query("SELECT * FROM user WHERE user_id=$rep_user"); 
     while($row31=mysql_fetch_array($sql31)) 
      { 
       $rep_username=$row31['user_name']; 
      } 
       echo("...........Reply BY ". $rep_username . "<br>"); 
     } 

    } 
} 

Here is the Result

+0

使用[JOIN](https://en.wikipedia.org/wiki/Join_%28SQL%29)s。 –

+0

使用加入特定的地方。 –

回答

1

是的,可以。你想使用MySQL JOIN syntax

例如:

SELECT u.*, p.*, c.*, r.* 
FROM users u 
JOIN posts p ON u.user_id = p.user_id 
JOIN comments c ON u.user_id = c.user_id 
JOIN replies r ON u.user_id = r.user_id 

希望,讓syou如何去了解它的想法。

+0

以及如果在同一評論中有很多回復時如何回顯它們,例如如何爲單個回覆的回覆完成抓取數組? –

+0

這是一個不同的問題:)如果你想要回復一個給定的評論,只需得到該評論的回覆:'SELECT * FROM回覆r WHERE r.commentId =?'。嘗試閱讀[這在W3schools.com](http://www.w3schools.com/sql/sql_join.asp)。 – Egg

+0

簡單地說,我想:WHERE post_user_id = user_ID的,並在該聲明中每一個崗位我想SELECT * FROM員額: SELECT * FROM WHERE comment_post_id = POST_ID 與回覆 –

0

您可以在不明確使用JOIN運算符的情況下將表連接在一起。可能是這樣的:

SELECT * 
FROM users, 
     posts, 
     comments, 
     replies 
WHERE posts.user_id = users.user_id 
     AND comments.post_id = posts.post_id 
     AND replies.comment_id = comments.comment_id 
+0

請始終使用JOIN運算符,因爲它爲優化程序提供了更多線索,讓您可以發生。您還可以將選擇參數添加到「JOIN ON ...」查詢中,以便優化程序可以在將結果加入其他表之前限制結果。理想情況下,您希望'where'子句爲空,但仍然選擇所需的所有行。 where子句是結果集行的最終過濾器。 –

+0

@RyanVincent我同意使用JOIN運算符,但這只是一個選擇。 – Amous

+0

在JOIN運算符中的問題是它只會迴響一次結果。 在我的情況下,我想回復同一評論的多個回覆以及同一帖子的多個評論。 如何解決這個問題循環在我的代碼中。 –