2010-03-04 5 views
1

У меня есть три таблицы CLASSES, CHILD_CLASSES и STUDENTS.MYSQL query INNER JOIN two table

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 таблицы самостоятельноно каждый КЛАСС может также иметь детей, связанных с этим классом. Таким образом, у КЛАССА 1 есть дети 2 и 3, а у Класса 2 - дети всего 3.

Так много учеников могут иметь одинаковый идентификатор класса. Студентам также разрешено видеть всю информацию, которая является дочерним элементом класса_id, связанного с ними, поэтому любой студент с идентификатором класса 1 может видеть классы 1, 2 и 3, но ученик с идеей класса 2 может видеть только классы с ID 2 и 3. Я пытаюсь найти запрос, чтобы подсчитать количество пользователей определенного класса, имеющего доступ. поэтому, если бы я искал class_id из 1, запрос вернул бы 3, потому что он имеет двух детей в таблице CHILD_CLASSES, а затем сам в таблице классов. Кажется, я не могу заставить это работать, но я всегда прихожу, потому что пытаюсь подсчитать 1 пользователя в таблице CLASSES.

запрос я использую до сих пор это

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

+0

, поэтому мой запрос вернет только 2, потому что он находит только два класса в таблице CHILD_CLASSES, где class_id одинаково. Мне нужно как-то добавить к итогу результат SELECT COUNT (class_id) FROM классов, где class_id = 1; – medium

+0

ЕСЛИ вы используете Pg, вы можете сделать рекурсивный запрос, где классы могут быть N-уровнями. Это будет также быстрее. –

ответ

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