2010-08-10 5 views
1

J'essaie d'écrire une requête pour savoir quels utilisateurs ne sont pas inscrits sur certains cours.trouver des valeurs manquantes dans MySQL

J'ai 2 tables; cours et utilisateurs. Les deux contiennent les champs 'id' puis 'coursename' et 'nom d'utilisateur' respectivement.

En utilisant ces deux tables, le système existant ajoute les utilisateurs à une troisième table (appelée inscrits_utilisateurs). Les utilisateurs prennent une ligne pour chacun. Par exemple, si l'ID utilisateur « 1 » est sur 4 parcours les enrolled_users ressemble à ceci:

----------------------- 
| user_id | course_id | 
----------------------- 
|  1 |  1  | 
|  1 |  2  | 
|  1 |  3  | 
|  1 |  4  | 
----------------------- 

Comme vous pouvez le voir ces données de table ne repose pas sur une relation, il est généré en PHP en utilisant les cours de deux tables 'et' utilisateurs '. Je ne sais pas comment écrire une requête sur la façon de savoir que l'utilisateur des cours '1' n'est pas inscrit, s'il y a 10 cours, mais que l'utilisateur '1' est seulement sur les cours 1- 4. Est-ce que je suppose que j'utilise quelque chose comme un LIKE ou un NOT LIKE?

SELECT u.id, c.id, ec.user_id, ec.course_id 
FROM users u, courses c, enrolled_courses ec 
WHERE u.id = ec.user_id 
AND c.id = ec.course_id 
AND u.id = '1' 

J'ai essayé d'utiliser = et <> mais cela ne montre pas ce que je dois!; une liste de cours sur lesquels l'utilisateur n'est pas inscrit. Désolé si je suis vague, essayant d'obtenir ma tête autour de lui!

En utilisant MySQL 5.0, sur un système existant, je ne peux pas modifier, seulement demander (pour le moment).

+0

l'idée est de ne pas se joindre à gauche et ajouter où course.id IS NULL –

Répondre

5
SELECT 
    * 
FROM 
    courses c 
WHERE 
    c.id NOT IN (
    SELECT 
     ec.course_id 
    FROM 
     enrolled_courses ec 
    WHERE 
     ec.user_id = 1 AND ec.course_id IS NOT NULL 
    ) 
+0

Merci, c'est parfait – Mathnode

0

Utilisez simplement un in et un sub select.

select * from courses c where c.id not in 
    (select course_id from enrolled_courses where user_id='1') 
+0

concept écriture, mais la table des utilisateurs ne dispose pas d'ID de cours ... c'est ce que les enrolled_courses était pour – DRapp

+0

Isn Est-ce la même chose si vous vous substituez aux cours inscrits? – Nix

+0

À la vôtre Nix, qui l'a fait pour: 'SELECT * des cours c WHERE c.id PAS DANS (SELECT course_id de enrolled_courses WHERE user_id = '1')' – Mathnode

0

Si vous êtes à la recherche d'un ID utilisateur spécifique, assurez-vous d'inclure cette condition d'identité dans le cadre de la clause WHERE, sinon, laissez le champ vide, et il vous donnera toutes les personnes qui ne sont pas inscrits à TOUTES les classes possibles via un produit cartésien (puisqu'il n'y a pas de jointure directe entre l'utilisateur et la table des cours). Cela peut être TRÈS long/long si vous essayez de courir pour tout le monde et votre table de cours est 100s. -3-4 cours.

select 
     u.id, 
     c.id CourseID 
    from 
     users u, 
     courses c 
    where 
      u.id = 1 
     AND c.id NOT IN 
      (select ec.Course_ID 
       from enrolled_courses ec 
       where ec.user_id = u.id) 
Questions connexes