所以,我打算做的是获取一个条目/帖子列表及其类别和用户详细信息,以及每个已发布的评论。 (条目,类别,用户和注释是单独的表)
下面的查询可以很好地获取记录,但它似乎跳过那些没有注释的条目。据我所知,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
答案 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_comments
。id
,假设这是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条目