[英]How to print posts and comments with only one sql query
是否可以通過一個sql查詢打印(PHP)我的所有博客文章和相關注釋?
如果是這樣,怎么辦?
我在朝這個方向思考:
SELECT p.post_id, p.title, c.comment_body
FROM posts p
LEFT JOIN comments c
ON c.parent_id = p.post_id
但這並沒有達到我的預期
使用一個SQL查詢不是很方便,因為您有1條帖子和多個注釋。
將帖子詳細信息添加到每個評論(在組合查詢中)會浪費資源。
獲取帖子的詳細信息並使用帖子的post_id
查找屬於該帖子的評論要方便得多。
如果您使用的是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
我能想到的最簡單的方法是遍歷所有返回的行,並將它們分組到一個關聯數組中,其中鍵是帖子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:
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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.