假设数据库中有3个表-classes
,board
和tasks
。其他两个表中的class_id
表中有classes
的FK引用。
在某些情况下,对于特定的class_id
,两个表中的任何一个都没有引用,或者一个表中可能没有另一个表。
目标是对两个表中的至少一个具有至少一个引用的所有classes
进行计数。
到目前为止,我已经尝试过:
SELECT COUNT(c.class_id) FROM classes as c
LEFT JOIN board as b on b.class_id = c.class_id
LEFT JOIN tasks as t on t.class_id = c.class_id
这实际上返回3个表中所有实例的计数,而计数应仅是主表中的计数。
答案 0 :(得分:2)
如评论中所述,您需要一个OR
连词来提取在board
或tasks
中引用的那些类(此OR
不是排他的,这意味着如果两个表中都引用了该类,则该类也会出现在结果集中。
我准备了一个小提琴供您玩耍:https://www.db-fiddle.com/f/xaa19Fk25bhtZh9EmGN42w/3
归结为:
SELECT COUNT(DISTINCT classes.class_id)
FROM classes
LEFT JOIN board ON classes.class_id = board.class_id
LEFT JOIN tasks ON classes.class_id = tasks.class_id
WHERE board.class_id IS NOT NULL OR tasks.class_id IS NOT NULL;
我还包括了前面的答案,以表明它返回了错误的值。
但是,当然,除了DISTINCT
之外,您还可以使用GROUP BY
方法。只需按顺序排列AND
和OR
。
答案 1 :(得分:0)
尝试一下。这样可以解决您的问题
Select COUNT(a.class_id)
FROM (
Select c.class_id FROM classes as c
LEFT JOIN board as b on b.class_id = c.class_id
LEFT JOIN tasks as t on t.class_id = c.class_id
where b.class_id IS NOT NULL OR t.class_id IS NOT NULL
Group by c.class_id) as a