2010-03-04 149 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