2010-01-24 4 views
1

J'ai des élèves de la table avec des colonnes ID étudiant et le nom de l'élève. J'ai également des événements de table avec l'identification de colonnes, l'identification d'étudiant et l'événement.Retour des lignes qui ont un enregistrement correspondant dans une autre table

Maintenant, je veux écrire une requête qui retournera seulement des rangées de la table des étudiants qui a son identification d'étudiant présent dans la table d'événements.

Je cours MySQL 5+.

Répondre

1

en plus JOIN et IN, vous pouvez également utiliser EXISTE

SELECT * FROM Students s 
WHERE EXISTS (SELECT * 
        FROM Events e 
        WHERE e.StudentID = s.StudentID) 
+0

Join est beaucoup plus rapide – artemb

+0

ON SQl Server une jointure et existe se traduira par le même plan d'exécution exact pour ce cas – SQLMenace

+0

Il n'utilise pas SQL Server. La question est étiquetée MySQL. –

0

Vous pouvez écrire WHERE StudentId IN SELECT StudentId FROM Events. (Ou au moins vous pouvez dans SQL Server)

0
SELECT DISTINCT s.* FROM Students s INNER JOIN Events e ON e.StudentId = s.id; 
+0

Cela peut retourner les mêmes enregistrements plusieurs fois – artemb

3

simple, jointure interne:

SELECT DISTINCT(Students.Id, Students.StudentName) 
FROM Students 
JOIN Events on Students.StudentId = Events.StudentId 
ORDER BY Students.StudentName 
+0

Pourquoi le distinct sur le nom? Si deux étudiants portent le même nom «John Smith», cela signifie-t-il qu'ils sont également la même personne? –

+0

@Mark: Bons yeux. Le besoin distinct d'inclure l'ID. –

+0

Quand j'ai utilisé la jointure, cela a fonctionné sur mon mysql local mais quand j'ai téléchargé le code sur mon hébergement web, il générait une exception à propos de trop de jointures car j'utilisais déjà deux jointures avant d'en ajouter une troisième. mais la méthode SQLMenace a fonctionné à la fois sur mysql.hx local et sur l'hébergement. – IndexController

0
select students.ID, students.name 
from students join events on students.id = events.studentID 
group by students.ID, students.name 
1
SELECT * FROM Students 
WHERE StudentID IN (SELECT StudentID 
        FROM Events 
        WHERE Events.StudentID = Students.StudentID) 
+0

Cela peut être très lent – artemb

Questions connexes