开发者

Displaying rows with count 0 in MySQL using COUNT and GROUP BY

开发者 https://www.devze.com 2023-03-11 14:54 出处:网络
I have two tables, Subject and Content, where Content references Subject with foreign key. I want to display how many times each subject appears in Content table (0, if it does not appear). But the qu

I have two tables, Subject and Content, where Content references Subject with foreign key. I want to display how many times each subject appears in Content table (0, if it does not appear). But the query below only gives me the rows with count > 0 and ignores the others:

SELECT Subject.id, Subject.name, COUNT(Content.subject_id) AS `count`
FROM Subject LEFT JOIN Content
ON Subject.id = Content.subject_id
WHERE type = @type
GROUP BY Subject.id;

I checked and tried to follow this, this and this post but for some reason the code above does not work.

Any ideas?

Edit: the type field is in the Content table 开发者_如何学Cand that was causing the the problem as "Will A" pointed out


Which table is type a column in? I'm supposing that it's Content - and by including the field in the WHERE clause, you're forcing the Content table on the right-hand side of the LEFT JOIN to have data in it (which means the LEFT JOIN is actually then just an INNER JOIN).

Try:

SELECT Subject.id, Subject.name, COUNT(Content.subject_id) AS `count`
FROM Subject
LEFT JOIN Content
ON Subject.id = Content.subject_id
AND type = @type
GROUP BY Subject.id;


Which table does column type belong to? If type is in subject, your left join should work. So I assume that type is in Content. Then the problem is that your WHERE clause won't match the cases where there are no matching lines in Content. Use

WHERE (type = @type) OR (type IS NULL)


Do an outer join instead. Replace the null with a 0. Replace non null with a 1. Instead of count, do a sum of this column.

Hope this helps

0

精彩评论

暂无评论...
验证码 换一张
取 消