2010-11-08 3 views
3

Supposons que vous ayez un schéma de base de données avec des tournois liés aux jeux. Un tournoi peut avoir beaucoup de jeux. J'essaie de rejoindre des tournois pour des jeux et seulement retirer des tournois avec tous les jeux dans le futur.Comment appliquer des conditions de jointure SQL sur plusieurs lignes jointes?

SELECT DISTINCT tournaments.* 
FROM tournaments 
INNER JOIN games ON tournaments.game_id = games.id 
WHERE games.event_date >= NOW(); 

Il y a quelques autres tableaux auxquels je m'associe, mais je l'ai simplifié pour cet exemple.

Ma requête retourne les résultats où tous les jeux du tournoi ne sont pas dans le futur.

J'ai aussi essayé de déplacer la condition dans la jointure:

SELECT DISTINCT tournaments.* 
FROM tournaments 
INNER JOIN games ON (tournaments.game_id = games.id AND games.event_date >= NOW()) 

mais j'obtenir le même résultat.

Comment puis-je m'assurer que tous les tournois renvoyés ont des jeux dans le futur, c'est-à-dire appliquer la condition sur toutes les lignes jointes?

Merci!

+0

Très similaire à http://stackoverflow.com/questions/4115006/sql-child-relation-query-help/4115127#4115127 – beach

Répondre

5

Je ne sais pas si cette requête exacte est appropriée pour MySQL. Mais l'idée devrait fonctionner - pour chaque tournoi, déterminer la première date de jeu, et renvoyer seulement les tournois pour lesquels cette date est plus grande que maintenant.

SELECT * from tournaments 
WHERE id IN 
(SELECT tournaments.id 
    FROM tournaments INNER JOIN games ON tournaments.game_id = games.id 
    GROUP BY tournaments.id 
    HAVING MIN(games.event_date) >= now() 
) 
+0

Merci beaucoup! Cela a été très utile et a résolu le problème. – shedd

0

peut-être quelque chose comme ceci:

SELECT DISTINCT t.* 
FROM tournaments t, (select id, event_date from games where event_date >= now()) g 
where t.game_id = g.id 
+0

Merci d'avoir répondu - malheureusement, cela ne semblait pas produire le bon ensemble. – shedd

0

Essayez cette

SELECT DISTINCT * 
FROM tournaments 
where game_id in (
Select id from games where event_date >= NOW() 
) 
+1

Cela donnera tous les tournois qui contiennent au moins un jeu dans le futur - ce qui est déjà le cas. –

+0

Merci d'avoir répondu - Dave a raison - cela a donné la même chose que la requête originale. – shedd

1
SELECT DISTINCT tournaments.* 
    FROM tournaments 
     INNER JOIN games 
      ON tournaments.game_id = games.id 
       AND games.event_date >= NOW() 
    WHERE NOT EXISTS (SELECT NULL FROM games g2 WHERE g2.id = tournaments.game_id AND g2.event_date < NOW()) 
+0

Merci d'avoir répondu - malheureusement, je n'ai pas pu obtenir cette réponse pour obtenir la bonne réponse. – shedd

Questions connexes