计算在其他表中至少具有一个引用的主表行

时间:2019-02-25 15:49:33

标签: mysql mysql-workbench

假设数据库中有3个表-classesboardtasks。其他两个表中的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个表中所有实例的计数,而计数应仅是主表中的计数。

2 个答案:

答案 0 :(得分:2)

如评论中所述,您需要一个OR连词来提取在boardtasks中引用的那些类(此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方法。只需按顺序排列ANDOR

答案 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