2012-11-27 44 views
4

我想用帖子列表製作一個頁面,並在每個帖子下面列出所有屬於該帖子的評論。起初,我只想用一個查詢來檢索所有帖子+評論使用SQL的JOIN,但我發現它不可能例如檢索一個帖子與多個評論。它只顯示每篇文章最多1條評論的帖子,或者根據評論數量多次顯示帖子。如何使用2個SQL查詢檢索包含所有評論的所有帖子

在此相關的問題,有人談到了使用2個查詢: How to print posts and comments with only one sql query

但是我怎麼做到這一點?

我有查詢和一個while循環的帖子,但我顯然不想運行該循環內的每個帖子的評論查詢。

$getPost = mysql_query('SELECT p.post_id, 
           p.user_id, 
           p.username, 
           p.content 
         FROM post p 
         ORDER BY p.post_id DESC'); 

while($row = mysql_fetch_array($getPost)) 
{ 
... 
} 

表結構(答覆是存儲意見表):

POST (post_id (primary key), user_id, username, content, timestamp) 
REPLY (reply_id (primary key), post_id, username, reply_content, timestamp) 
+0

向我們展示您的表格結構。 – Kermit

+0

這是您製作的還是喜歡Wordpress的系統?如果你自己,關於表格的更多細節將有所幫助 –

+1

我不明白爲什麼SQL JOIN不適合你。 – Fer

回答

4

你可以做一個單一的查詢,這是確定的,如果數據在你的原帖量

$getPost = mysql_query('SELECT 
    p.*, 
    r.reply_id, r.username r_username, r.reply_content, r.timestamp r_timestamp 
    FROM post p 
    left join reply r 
    ORDER BY p.post_id DESC' 
); 

$posts = array(); 
$last_id = 0; 
while($row = mysql_fetch_array($getPost)) 
{ 
    if ($last_id != $row['post_id']) { 
    $posts[] = array(
     'post_id' => $row['post_id'], 
     'user_id' => $row['user_id'], 
     'username' => $row['username'], 
     'content' => $row['content'], 
     'timestamp' => $row['timestamp'], 
     'comments' => array() 
    ); 
    } 

    $posts[sizeof($posts) - 1]['comments'][] = array(
    'reply_id' => $row['reply_id'], 
    'username' => $row['r_username'], 
    'reply_content' => $row['reply_content'], 
    'timestamp' = $row['r_timestamp'] 
); 
} 

否則,它分成兩個查詢,像這樣:

$getPost = mysql_query('SELECT 
    p.*, 
    FROM post p 
    ORDER BY p.post_id DESC' 
); 

$rows = array(); 
$ids = array(); 
$index = array(); 
while($row = mysql_fetch_assoc($getPost)) { 
    $row['comments'] = array(); 
    $rows[] = $row; 
    $ids[] = $row['post_id']; 
    $index[$row['post_id']] = sizeof($rows) - 1; 
} 

$getComments = mysql_query('select r.* from replies r where r.post_id in ("' 
    . join('","', $ids) 
    . '")'); 
while ($row = mysq_fetch_assoc($getComments)) { 
    $rows[$index[$row['post_id']]]['comments'][] = $row; 
} 

...或者類似的東西。任何一個選項都可以讓你用WHERE子句把你的第一個查詢拋到你的內心。第二種方法的優點是,您不會爲每條評論重新發送原始發佈數據!

+0

非常感謝幫助我,讓我學習東西。真棒社區。 – David

+1

後面的例子是現貨。這是一個常見的問題,我發現利用兩個查詢是這樣的 - 特別是如果帖子內容很大的話。有兩個快速查詢比一個慢速查詢更好。 – FredTheWebGuy

1

爲了還可以獲得這些職位沒有意見,你需要使用一個LEFT OUTER JOIN。在這種情況下,第一個表中沒有任何相應行的第二個表中的任何行將與由空值組成的行配對。

SELECT * FROM posts 
LEFT OUTER JOIN comments ON posts~post_id = comments~post_id; 

順便說一句:還有一個RIGHT OUTER JOIN。當你使用它的時候,你會得到所有的評論,包括那些父郵件丟失的地方,但沒有評論的帖子。

+0

我試過這個,但是例如:我有3個評論的帖子。此查詢顯示每條評論的單個帖子3次。 – David

+0

只要你使用關係數據庫而不是分層數據庫,你就不會解決這個問題 - 但是當你也使用'SORT BY post_id'時,不應該很難在PHP級別解決這個問題。 – Philipp

相關問題