2011-10-06 87 views
2

我對MySQL相對來說比較陌生,而且我對這部分內容感到厭煩。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 

拉動正確的信息,此查詢結果,但如果有在博客上兩點意見,它將顯示博客和兩遍,因爲它是通過循環的意見。我想一次顯示所有的博客信息,然後通過評論循環。

我希望我解釋清楚。任何幫助都會很棒。謝謝。

+0

好 - 只是存儲當前博客的ID,並檢查它的下一次迭代。如果它是相同的 - 不要輸出它 – zerkms

+0

將查詢分成兩步怎麼辦?首先,你會得到博客數據,並在第二個博客的評論。 –

+0

我非常希望在一個查詢中執行此操作。是否有可能嘗試構建一個子查詢?如果是這樣,我怎麼能在這裏使用? – Yuschick

回答

3

您正在描述的行爲是聯接應該執行的操作。如果您只想爲每個博客條目記錄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 
+0

11個查詢,而不是1個或2個10個項目的頁面** **差異很大 – zerkms

+0

11大於2,但在執行時間方面,它可能不會引起注意。 – Kibbee

+0

事實上,它不會適用於每天10個訪問者的網站。 – zerkms

0

有兩種方法,你可以接近這樣的:

如果你絕對需要做到這一點的一個查詢,用你的加入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 
} 

更有效的方法是將其作爲兩個查詢來運行。首先選擇博客信息,用職位的計數:

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大於零greather,分別選擇意見和顯示器。

更不用說有不同種類的博客瀏覽;在索引頁上,第二個查詢將是您需要在每篇文章中提取博客摘要和評論數量的全部內容,而無需顯示每條評論的內容。

0

有兩個部分,你需要看看,一個是你的查詢,另一個是你如何顯示的東西。

我剛剛找到一些簡單的工具來建立MYSQL查詢和分析你的查詢,甚至可以連接你的數據庫與網站。

您可以在谷歌鉻市場搜索或通過下面的鏈接。

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

MYSQL query builder