[英]MySQL Join Returns too many Rows
我是MySQL的新手,因此對本節感到困惑。
我正在構建一個簡單的博客頁面,該頁面將顯示一個博客以及與之相關的評論。 我目前有兩個表來處理此數據:
博客
.blog_id (primary), .blog_title, .blog_date, .blog_post
評論
.comment_id (primary), .blog_id, .comment_name, .comment
我想做的是拉一個與ID匹配的特定博客,並拉出與該博客相關的評論。 這是我的查詢:
SELECT * FROM blogs JOIN comments ON blogs.blog_id=comments.blog_id WHERE blogs.blog_id = $active ORDER BY comments.comment_id
該查詢可獲取正確的信息,但是如果博客上有兩個評論,則在循環瀏覽這些評論時,它將顯示博客和所有內容兩次。 我想一次顯示所有博客信息,然后在評論中循環。
我希望我能清楚地解釋這一點。 任何幫助都將是極好的。 謝謝。
您描述的行為是聯接應該執行的操作。 如果每個博客條目只需要1條記錄,則需要使用group by。 要獲得帶有評論數量的所有博客記錄的列表,可以執行以下查詢:
SELECT blogs.*,Count(comments.comment_ID)
FROM blogs
LEFT JOIN comments
ON blogs.blog_id=comments.blog_id WHERE blogs.blog_id = $active
ORDER BY comments.comment_id
GROUP By Blog.BlogID
但是,您說過只想顯示博客,然后顯示與該博客相關的評論。 在這種情況下,您很可能僅使用一個初始查詢來提取所有博客,然后在遍歷所有博客條目以獲取每個博客的評論時使用另一個查詢。 這是一些偽代碼。
select * FROM blogs
For each record from above
Code for displaying blog goes here
Select * FROM Comments where Blog_id = $blogID
For each comment from above query
code for displaying comment goes here
Next COmment
Next Blog
您可以對所有注釋進行一次選擇,這樣會更有效,但是會使結果代碼更加復雜,因為您必須在結果列表中使用php查找記錄。 僅使用多個查詢就更簡單了,對於大多數博客(每頁最多10篇文章)來說,這並沒有多大區別。 如果您確實要使用單個查詢,則可以按照下面的偽代碼來構造程序。
SELECT * FROM blogs
LEFT JOIN comments ON blogs.blog_id=comments.blog_id
WHERE blogs.blog_id = $active ORDER BY blogs.blog_id, comments.comment_id
$LastBlogID = -1
FOR EACH Record
If $LastBlogID != record['blog_id']
Display Blog Information
$LastBlogID = record['blog_id']
End If
Display Comment Information
Next Record
有兩種方法可以解決此問題:
如果您絕對需要在一個查詢中執行此操作,請使用加入的SQL並使用博客的ID作為唯一鍵來遍歷結果:
$blogId = 0;
while ( null != ($row = mysql_fetch_assoc( $result ) ) )
{
if ( $row['blog_id'] != $blogId )
{
// Display blog contents here
$blogId = $row['blog_id'];
}
// Print coment
}
更有效的方法是將其作為兩個查詢運行。 首先選擇Blog信息,其計數為POSTS:
SELECT blog_id, blog_title, blog_date, blog_post, COUNT(*) as comment_count
FROM blogs INNER JOIN comments ON blogs.blog_id = comments.blog_id
WHERE blog_id = $blogId
GROUP BY blog_id, blog_title, blog_date, blog_post;
或者,使用子選擇:
SELECT blog_id, blog_title, blog_date,
(SELECT COUNT(*) FROM comments WHERE blog_id = blog.blog_id) as comment_count
FROM blogs
WHERE blog_id = $blogId
更不用說有不同種類的博客視圖。 在索引頁面上,第二個查詢將是您只需要提取博客摘要和每個帖子的評論數,而無需顯示每個評論的內容。
您需要研究兩個部分,一個是查詢,另一個是如何顯示事物。
我剛剛找到了一些簡單的工具來構建MYSQL查詢並分析您的查詢,甚至可以將數據庫與網站連接起來。
您可以在Google Chrome瀏覽器市場中搜索,也可以通過以下鏈接進行搜索。
我只是給出一個建議和方向,而不是實際解決它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.