2009-07-21 62 views
0

所以,我打算做的是獲取與他們的類別和用戶的詳細信息條目/職位列表,它的每一個總髮表評論。 (項,類別,用戶和評論都是獨立的表)SQL幫助:COUNT聚合,參賽名單和評論數

下面這個查詢獲取記錄很好,但它似乎跳過沒有評論的條目。據我所知,JOIN是好的(註釋表上的LEFT JOIN),並且查詢是正確的。我錯過了什麼 ?

SELECT entries.entry_id, entries.title, entries.content, 
entries.preview_image, entries.preview_thumbnail, entries.slug, 
entries.view_count, entries.posted_on, entry_categories.title AS category_title, 
entry_categories.slug AS category_slug, entry_categories.parent AS category_parent, 
entry_categories.can_comment AS can_comment, entry_categories.can_rate AS can_rate, 
users.user_id, users.group_id, users.username, users.first_name, users.last_name, 
users.avatar_small, users.avatar_big, users.score AS user_score, 
COUNT(entry_comments.comment_id) AS comment_count 

FROM (entries) 
JOIN entry_categories ON entries.category = entry_categories.category_id 
JOIN users ON entries.user_id = users.user_id 
LEFT JOIN entry_comments ON entries.entry_id = entry_comments.entry_id 

WHERE `entries`.`publish` = 'Y' 
AND `entry_comments`.`publish` = 'Y' 
AND `entry_comments`.`deleted_at` IS NULL 
AND `category` = 5 

GROUP BY entries.entry_id, entries.title, entries.content, 
entries.preview_image, entries.preview_thumbnail, entries.slug, 
entries.view_count, entries.posted_on, category_title, category_slug, 
category_parent, can_comment, can_rate, users.user_id, users.group_id, 
users.username, users.first_name, users.last_name, users.avatar_big, 
users.avatar_small, user_score 

ORDER BY posted_on desc 

編輯:我使用的MySQL 5.0

回答

1

嗯,你在做左連接上entry_comments,與條件:

`entry_comments`.`publish` = 'Y' 
`entry_comments`.`deleted_at` IS NULL 

對於沒有評論的條目,這些條件是錯誤的。 我想這應該解決的問題:

WHERE `entries`.`publish` = 'Y' 
AND (
     (`entry_comments`.`publish` = 'Y' 
     AND `entry_comments`.`deleted_at` IS NULL) 
    OR 
     `entry_comments`.`id` IS NULL 
    ) 
AND `category` = 5 

在OR條件,我把entry_commentsid,假設這是entry_comments表的主鍵,所以你應該entry_comments真正的主鍵替換它。

1

這是因爲你在列在表entry_comments設置一個過濾器。替換爲第一:

AND IFNULL(`entry_comments`.`publish`, 'Y') = 'Y' 

因爲你在這個表中的其他過濾器是IS NULL之一,這是所有你需要做的,允許從左邊的不匹配的行JOIN通過。

+0

取代: 「AND`entry_comments`.`publish` = 'Y'」 與 「AND ISNULL(`entry_comments`.`publish`, 'Y')= 'Y'」 的結果在語法錯誤。或者我弄錯了? – andyk 2009-07-21 07:51:50

+0

對不起,在MySQL中,它的IFNULL不ISNULL - 編輯答案。 – 2009-07-21 08:29:54

+0

好的,IFNULL對我來說是新的。你如何考慮`deleted_at`?作爲計算應予以公佈,並有`在NULL – andyk 2009-07-21 08:54:19

0

嘗試改變LEFT JOIN到LEFT OUTER JOIN

OR

我不是專家,這種風格的SQL連接(多一個Oracle的人辯論),但左側的措辭加盟正在引導我相信,它正在加入entry_comments,並在左邊填入entry_comments,你真的希望它是另一種方式(我認爲)。

所以你可以試試:

LEFT OUTER JOIN條目ON entries.entry_id = entry_comments.entry_id