SQL帮助:COUNT聚合,条目列表及其注释计数

时间:2009-07-21 07:43:08

标签: sql mysql

所以,我打算做的是获取一个条目/帖子列表及其类别和用户详细信息,以及每个已发布的评论。 (条目,类别,用户和注释是单独的表)

下面的查询可以很好地获取记录,但它似乎跳过那些没有注释的条目。据我所知,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

3 个答案:

答案 0 :(得分:1)

这是因为您要在entry_comments表中的列上设置过滤器。将第一个替换为:

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

因为此表上的其他过滤器是IS NULL,所以您需要做的就是允许来自LEFT JOIN的不匹配行。

答案 1 :(得分: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的真实主键。

答案 2 :(得分:0)

尝试将LEFT JOIN更改为LEFT OUTER JOIN

OR

我不是这种SQL连接风格的专家(我自己更多的是Oracle人员),但是左连接的措辞让我相信它正在将entry_comments加入到左边有entry_comments的条目中,你真的希望它成为另一种方式(我认为)。

所以尝试类似:

在entry.entry_id = entry_comments.entry_id

上的LEFT OUTER JOIN条目