2010-12-13 7 views
3

J'ai une table et j'ai besoin de vérifier si deux utilisateurs, pour lesquels j'ai les ID (par exemple 20 et 21) partagent le même cours, juste vrai ou faux.Requête SQL pour vérifier si student1 a un cours avec étudiant 2

 
Table: jos_gj_users 
Columns: id_user, id_group 

Data Example: (20; 4) 
       (20; 5) 
       (20; 6) 
       (21; 6) 
       (21; 7) 

Les données ci-dessus montre que l'utilisateur 20 et l'utilisateur 21 partagent le cours 6, mais comment puis-je obtenir cela avec SQL en entrant simplement les cartes d'identité et sans boucle à travers les résultats avec PHP?

Répondre

3

Essayez un autojointure:

SELECT T1.id_group 
FROM jos_gj_users T1 
JOIN jos_gj_users T2 
ON T1.id_group = T2.id_group 
WHERE T1.id_user = 20 
AND T2.id_user = 21 

obtenir juste un « vrai ou faux » résultat que vous pouvez vérifier à partir du client pour voir si au moins une ligne existe dans le jeu de résultats plutôt que de chercher de l'ensemble résultats.

Sinon, vous pouvez le faire dans SQL en enveloppant la requête ci-dessus dans un autre SELECT qui utilise EXISTE:

SELECT CASE WHEN EXISTS 
(
    SELECT T1.id_group 
    FROM jos_gj_users T1 
    JOIN jos_gj_users T2 
    ON T1.id_group = T2.id_group 
    WHERE T1.id_user = 20 
    AND T2.id_user = 21 
) THEN 1 ELSE 0 END AS result 

Cette requête renvoie soit 0 (false) ou 1 (vrai).

0

L'idée est que vous devez joindre la table à lui-même. Au premier semestre vous recherchez utilisateur 1 et dans la deuxième moitié vous cherchez utilisateur 2. Et bien sûr, seules les lignes qui ont la même id_group dans les deux demi sont pertinents:

SELECT count(*) 
FROM jos_gj_users As j1, jos_gj_users As j2 
WHERE j1.id_user = 20 AND j2.id_user = 21 
AND j1.id_group = j2.id_group 

Ce sera toujours retourner une ligne avec une colonne: Le nombre de cours partagés. Si c'est 0, ils ne partagent aucun cours.

0

Vous pouvez le faire avec une sous-sélection:

select id_group 
from jos_gj_users 
where (id_user = 20) 
and id_group in (select id_group from jos_gj_users where id_user = 21) 
0
SELECT COUNT(*) > 0 FROM jos_gj_users WHERE id_user=54321 AND id_group IN (SELECT id_group FROM jos_gj_users WHERE id_user = 1345) 
0

Cette requête est qui montre les utilisateurs de mêmes groupes.

SELECT 
    * 
FROM 
    jos_gj_users T1 
    INNER JOIN jos_gj_users T2 ON T1.id_group = T2.id_group 
0

pour cette solution - il accepte les paramètres d'entrée dans la première zone en gras, et retourne une valeur de VRAI ou FAUX via une instruction CASE sur la base des valeurs dans les secondes zones bolded.

SELECT CASE DISTINCT QUAND
(SELECT COUNT DISTINCT (de id_group) DE jos_gj_users OÙ id_user EN (20, 21)
GROUP BY id_group
HAVING COUNT (DISTINCT id_user) = 2) IS NOT NULL ALORS 'TRUE'
AUTRE 'FAUX'
FIN DE
jos_gj_users