簡體   English   中英

MySQL Join返回太多行

[英]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
  • 僅當comment_count大於零時,才分別選擇注釋並顯示。

更不用說有不同種類的博客視圖。 在索引頁面上,第二個查詢將是您只需要提取博客摘要和每個帖子的評論數,而無需顯示每個評論的內容。

您需要研究兩個部分,一個是查詢,另一個是如何顯示事物。

我剛剛找到了一些簡單的工具來構建MYSQL查詢並分析您的查詢,甚至可以將數據庫與網站連接起來。

您可以在Google Chrome瀏覽器市場中搜索,也可以通過以下鏈接進行搜索。

我只是給出一個建議和方向,而不是實際解決它。

MYSQL查詢生成器

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM