MYSQL查询INNER JOIN两个表

时间:2010-03-04 18:46:06

标签: sql mysql

我有三个表CLASSESCHILD_CLASSESSTUDENTS

CLASSES看起来像这样(它自我引用):

CLASS_ID | CLASS_PARENT |
-------------------------
    1    |      ---
    2    |       1 
    3    |       2

CHILD_CLASSES看起来像这样:

CC_ID | PARENT_CLASS_ID | CHILD_CLASS_ID
----------------------------------------
  1   |       1         |     2    
  2   |       1         |     3
  3   |       2         |     3

STUDENTS看起来像这样

 STU_ID | CLASS_ID | STU_NAME
 ----------------------------
    1   |     1    |     A
    2   |     1    |     B
    3   |     2    |     C

基本上CLASSES表是自引用的,但每个CLASS也可以有子类与该类相关联。所以CLASS 1有2个孩子和3个孩子,2个孩子只有3个孩子。

所以很多学生可以拥有相同的班级ID。学生还可以查看与他们相关的class_id的孩子的所有信息,因此任何班级ID为1的学生都可以看到1级,2级和3级,但班级2级的学生只能看到班级ID为2和3.我试图找到一个查询来计算具有访问权限的特定类的用户数。因此,如果我查看class_id为1,则查询将返回3,因为它在CHILD_CLASSES表中有两个子项,然后它们本身在classes表中。我似乎无法让这个工作,但我总是很短,因为我试图计算CLASSES表中的1个用户。

我目前使用的查询是

SELECT COUNT(class_id) as TOTAL 
  FROM students 
 WHERE class_id IN (SELECT class_id 
                      FROM child_classes 
                     WHERE parent_class_id = 1);

1 个答案:

答案 0 :(得分:1)

看起来child_classes包含与classes相同的数据,因此以下内容应该有效:

SELECT COUNT(*)
FROM students
WHERE class_id = 1
   OR class_id IN ( SELECT child_class_id
                    FROM child_classes
                    WHERE parent_class_id = 1
                  )

它会返回studentsclass_id = 1的所有parent_class_id = 1或属于{{1}}的班级。