2010-03-04 7 views
1

J'ai trois tables CLASSES, CHILD_CLASSES et STUDENTS.requête MYSQL INNER JOIN deux table

CLASSES ressemble à ceci (son référencement auto):

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

CHILD_CLASSES ressemble à ceci:

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

STUDENTS ressemble à ceci

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

Fondamentalement, la table CLASSES est auto référencement, mais chaque classe peut également avoir des enfants associés à cette classe. Donc CLASSE 1 a les enfants 2 et 3 et la classe 2 a des enfants de seulement 3.

Ainsi, beaucoup d'élèves peuvent avoir le même ID de classe. Les étudiants sont également autorisés à voir toutes les informations qui sont un enfant du class_id qui leur est associé afin que tout étudiant ayant un ID de classe 1 puisse voir les classes 1, 2 et 3, mais qu'un étudiant ayant une idée de classe ne puisse voir que des classes avec ID 2 et 3. J'essaie de trouver une requête pour compter le nombre d'utilisateurs d'une classe particulière qui ont accès. donc si je regardais class_id de 1, la requête retournerait 3 parce qu'elle a deux enfants dans la table CHILD_CLASSES et ensuite elle-même dans la table des classes. Je ne peux pas sembler faire fonctionner ceci cependant, je viens toujours court parce qu'en essayant de compter le 1 utilisateur dans la table de CLASSES.

la requête J'utilise à ce jour est ce

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

Pourriez-vous publier la requête que vous utilisez? – EFraim

+0

donc ma requête renverra seulement 2 parce qu'elle trouve seulement les deux classes dans la table CHILD_CLASSES où le class_id est le même. J'ai besoin d'ajouter en quelque sorte au total le résultat des classes SELECT COUNT (class_id) FROM où class_id = 1; – medium

+0

SI vous utilisiez Pg, vous pouviez faire une requête récursive où les classes pouvaient être au niveau N. Ce serait aussi plus rapide. –

Répondre

1

Ressemble child_classes contient les mêmes données que classes, de sorte que les éléments suivants devraient fonctionner:

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

Il renvoie le nombre de tous students qui ont class_id = 1 ou sont dans une classe qui a parent_class_id = 1.

+0

Merci pour ce travail, je savais que j'étais proche. oui il contient les mêmes données et il y a une raison à cela mais de toute façon c'est super merci – medium