2010-03-04 112 views
1

我有三个表CLASSES,CHILD_CLASSESSTUDENTSMYSQL查询INNER JOIN两个表

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.我试图找到一个查询来计算有权访问的特定类的用户数量。所以如果我查看1的class_id,查询将返回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); 
+2

您可以发布您正在使用的查询吗? – EFraim 2010-03-04 18:51:41

+0

所以我的查询将只返回2,因为它只是在CHILD_CLASSES表中找到class_id相同的两个类。我需要以某种方式添加到总计SELECT COUNT(class_id)FROM类的结果,其中class_id = 1; – medium 2010-03-04 18:58:58

+0

如果你使用Pg,你可以做一个递归查询,其中类可以是N级的。它也会更快。 – 2010-03-04 19:07:47

回答

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 
       ) 

它返回所有students的计数其中有class_id = 1或者有parent_class_id = 1

+0

谢谢你这个作品,我知道我很接近。是的,它包含相同的数据,并有一个原因,但无论如何,这是非常好的谢谢你 – medium 2010-03-04 19:05:48