2017-10-06 1 views
1

J'ai besoin d'aide avec une requête SQL. J'ai une table des cours et une table qui contient l'identification d'utilisateur et l'identification de cours, dénotant des cours que l'utilisateur a prises (ne pourrait pas avoir pris aucune; aucune entrée dans cette table pour cet id d'utilisateur).Requête SQL - liste d'éléments dans une table pas dans une autre

J'ai besoin d'une requête pour retourner la liste des cours pas pris.

Course Category table 
    CategoryID 
    Caegory 

Courses table 
    CourseID 
    CategoryID 
    CourseName 
    ... 

UserCourse table 
    UserID 
    CourseID 
+0

Tous les cours non suivis par un utilisateur? Tous les cours ne sont pas pris par un utilisateur particulier? Tous les cours non suivis par utilisateur (c'est-à-dire toutes les paires utilisateur/cours qui ne figurent pas encore dans la table UserCourse)? –

Répondre

0

Ce sera juste la liste au cours

select * 
from Courses C 
Left join CourseCategory cc on 
cc.CategoryID = c.CategoryID 
where CourseID not in (Select CourseID from UserCourse where UserID = 14) 
+0

L'ID utilisateur sera dans la table UserCourse uniquement si l'utilisateur a suivi le cours. La première requête ne renvoie aucun résultat même si un utilisateur prend tous les cours de la catégorie. Le deuxième semble indiquer une liste de cours non suivis par qui que ce soit; ce dont j'ai besoin est pour un identifiant d'utilisateur donné et une catégorie de cours, quels cours dans cette catégorie n'ont pas été pris par cet utilisateur. – NoBullMan

+0

J'ai ajouté une clause where à la table dérivée. Changez juste la valeur à ce que vous voulez ou utilisez un paramètre – scsimon

1

vous pouvez utiliser not exists

Select * 
From Courses c 
Where Not Exists (Select 1 From UserCourse uc Where uc.CourseID = c.CourseID) 
+0

comment filtrer ceci pour un identifiant d'utilisateur donné? – NoBullMan

+0

Une autre bonne approche +1 – scsimon

0

ce que j'ai besoin est pour un ID utilisateur et une catégorie bien sûr, quels cours dans cette catégorie n'ont pas été prises par cet utilisateur

(Cela aurait dû être à la demande de la voie.)

Alors:

  1. Sélectionnez à partir courses.
  2. Limiter à la catégorie souhaitée.
  3. Limiter aux cours qui ne figurent pas dans l'ensemble des cours suivis par l'utilisateur.

La requête:

select * 
from courses 
where categoryid = 123 
and courseid not in (select courseid from usercourse where userid = 456); 
0

Une autre façon d'écrire même requête, qui se produira plus rapidement.

select C.CourseID,C.CategoryID 
from Courses C 
Left join CourseCategory cc on 
cc.CategoryID = c.CategoryID 
left join UserCourse uc 
on C.CourseID=uc.CourseID 
where uc.CourseID is null