2012-01-10 5 views
2

je événements, events_styles, events_formats tables (un événement peut avoir de nombreux styles et de nombreux formats) Je suis en train de filtrer les événements qui ont un events_styles rejoindre et events_formats rejoindre. Ainsi, la requête doit sélectionner tous les événements qui sont un style particulier et un format particulier - mes tentatives jusqu'à présent:MySQL multiples plusieurs à plusieurs jointures

SELECT * FROM events 
JOIN events_styles ON events.id = events_styles.event_id 
JOIN events_formats ON events.id = events_formats.format_id 
WHERE events_styles.style_id = 3 AND events_formats.format_id = 1; 

Empty set (0.00 sec) 

SELECT * FROM events_styles 
WHERE events_styles.style_id = 3 
+----------+----------+ 
| event_id | style_id | 
+----------+----------+ 
|  3 |  3 | 
|  2 |  3 | 
|  4 |  3 | 
+----------+----------+ 
3 rows in set (0.00 sec) 

SELECT * FROM events_formats 
WHERE events_formats.format_id = 1  
+----------+-----------+ 
| event_id | format_id | 
+----------+-----------+ 
|  1 |   1 | 
|  3 |   1 | 
|  4 |   1 | 
+----------+-----------+ 
3 rows in set (0.00 sec) 

La première requête doit retourner l'événement avec l'ID 4? Je suis sûr que j'ai besoin de combiner la deuxième et la troisième requête dans une sous-requête, mais je ne suis pas sûr de la syntaxe - merci

+0

Vous allez vous lancer; votre condition de jointure events.id = events_formats.format_id devrait être events.id = events_formats.event_id – dash

Répondre

1

Vous êtes très proche!

Votre requête doit être:

SELECT * FROM events 
JOIN events_styles ON events.id = events_styles.event_id  
JOIN events_formats ON events.id = events_formats.event_id 
WHERE events_styles.style_id = 3 
AND events_formats.format_id = 1; 

En rejoignant sur format_id et non EVENT_ID vous n'allez obtenir event_id = 1 qui n'a pas id de style correspoding de 3. C'est où vous êtes allé mal :-)

+0

Votre droite - je commence le coup de pied de soi! - Merci – rebelbass