是否可以通過一個sql查詢打印出(PHP)我所有的博客文章+相關評論?如何用一個sql查詢打印帖子和評論
如果是這樣,怎麼樣?
我想在這個方向:
SELECT p.post_id, p.title, c.comment_body
FROM posts p
LEFT JOIN comments c
ON c.parent_id = p.post_id
但如我所料
是否可以通過一個sql查詢打印出(PHP)我所有的博客文章+相關評論?如何用一個sql查詢打印帖子和評論
如果是這樣,怎麼樣?
我想在這個方向:
SELECT p.post_id, p.title, c.comment_body
FROM posts p
LEFT JOIN comments c
ON c.parent_id = p.post_id
但如我所料
我能想到的最簡單的方法是通過所有的行迭代返回,他們這個組沒有奏效轉換爲關聯數組,其中鍵是發佈ID。然後,您可以遍歷該關聯數組並打印每個帖子的評論,從組中的第一行獲取帖子標題。
當獲取數據時,只需使用字段名稱: $ result = mysql_query(「SELECT p.post_id,p.title,c.comment_body FROM posts p LEFT JOIN comments c ON c.parent_id = p.post_id」) ;
while($row = mysql_fetch_array($result))
{
echo $row['title'] . " " . $row['comment_body'];
echo "<br />";
}
如果你使用MySQL,你可以使用GROUP_CONCAT功能:
SELECT p.post_id, p.title, GROUP_CONCAT(c.comment_body)
FROM posts
LEFT JOIN comments c ON c.parent_id = p.post_id
GROUP BY p.post_id
對於MySQL:
SELECT p.post_id, p.title, GROUP_CONCAT(c.comment_body), count(*) as coment_cnt
FROM
posts p
LEFT JOIN comments c ON (p.post_id = c.parent_id)
GROUP BY
p.post_id
「但這並沒有按照我的預期工作「
...但你不說你的期望。
假設在查詢中隱含的模式是正確的,那麼它是沒有道理的,只顯示帖子一次:
$lastpostid=false;
while ($r=mysql_fetch_assoc($result)) {
if ($r['post_id']!=$lastpost) {
print "Post: " . $r['title'] . "<br />\n";
$comment_id=1;
$lastpost=$r['post_id'];
}
print "Comment # $comment_id : " . $r['comment_body'] . "<br />\n";
$comment_id++;
}
但正如我所說,這意味着你的查詢是正確的(即評論不是分層的)。
C.
使用一個SQL查詢不是很方便,因爲您有1個帖子和多個註釋。
將帖子詳細信息添加到每個評論(在組合查詢中)是浪費資源。
獲取帖子的詳細信息並使用帖子的post_id
查找屬於該帖子的評論要方便得多。
+1,它應該是$ row ['comment_body'] [1]。這是一個需要兩個查詢的情況 - 這是一個一對多的關係到評論的帖子。只有當它是一對一的關係時,才能嘗試從兩個表中獲取數據並進行連接。 – 2010-01-12 15:14:24
同意。這絕對是一種使用一個查詢沒有意義的情況。 – inxilpro 2010-01-12 15:28:00
我需要這個,因爲我想創建一個包含所有數據的XML文件(所有文章+10個最近的評論/文章)。當你有100個帖子時,我不知道最好的解決方案是什麼。這意味着你必須執行100個SQL查詢? – Bundy 2010-01-12 15:43:19
爲什麼不按預期工作? – 2010-01-12 14:27:37
您希望結果看起來如何? – 2010-01-12 14:30:40
你明確地將它標記爲mysql/join,但也許你想嘗試http://www.mongodb.org/display/DOCS/PHP+Language+Center'MongoDB(來自「humongous」)是一個可擴展的高性能,開源,無模式,面向文檔的數據庫。「 – VolkerK 2010-01-12 14:45:21