我有一个类别列表和另一个条目表,它与它所属的类别有关。我试图聚合这些工作正常,但是当我添加一个日期参数时,任何在该时间段内没有条目的类别都不会显示,我希望它显示为0
SELECT DISTINCT c.label, COUNT(e.user_id) AS TOTAL
FROM category c, entry e
WHERE c.id NOT IN (19,20)
WHERE e.category_id(+) = c.id
AND e.date_added > (SYSDATE - 14) -- Problem
GROUP BY(c.label)
我理解为什么它没有出现,只是不确定它的方式?
更新
分类表 - ID - 标签 ...
条目表 - ID - category_id - e.user_id ...
它在给定时间段组中的所有条目属于它们属于哪个类别。我想显示我的所有类别,即使在这段时间内没有条目。我认为外部联接会解决这个问题。
答案 0 :(得分:1)
首先,学习正确的join
语法。并且,当您使用select distinct
时,您不需要group by
。您的查询将如下所示:
SELECT c.label, COUNT(e.id) AS TOTAL
FROM category c LEFT JOIN
entry e
ON e.category_id = c.id
WHERE c.id NOT IN (19, 20) AND e.date_added > (SYSDATE - 14)
GROUP BY c.label;
然后,如果要保留所有类别,请将第二个表(e
)上的条件移动到on
子句中:
SELECT c.label, COUNT(e.id) AS TOTAL
FROM category c LEFT JOIN
entry e
ON e.category_id = c.id AND
e.date_added > (SYSDATE - 14)
WHERE c.id NOT IN (19, 20)
GROUP BY c.label;
这是显式join
语法更好的原因之一。