2010-11-07 7 views
1

J'ai une relation un à plusieurs dans ma base de données où un événement peut avoir plusieurs dates. J'ai besoin de trouver tous les événements qui n'ont aucun événement supérieur aux dates actuelles (c'est-à-dire les événements qui ont expiré).Interroger plusieurs dates PAS supérieures à la date actuelle

J'utilise ce qui suit pour sélectionner tous ces événements avec des dates dans l'avenir:

SELECT events.id AS id,events.picture,events.name,events.venue,events.city 
FROM events,event_dates 
WHERE event_dates.start_date >= DATE(NOW()) 
GROUP BY events.id ORDER BY events.id DESC 

Je ne suis pas très intelligent d'essayer d'inverser cela, et obtenir des événements où toutes les dates sont < DATE(NOW()) ou NOT event_dates.start_date >= DATE(NOW())

Lequel (ou aucun) n'est plus proche de l'idée.

Répondre

1

Utilisation:

SELECT e.id, 
     e.picture, 
     e.name, 
     e.venue, 
     e.city 
    FROM EVENTS e 
WHERE NOT EXISTS(SELECT NULL 
        FROM EVENT_DATES ed 
        WHERE ed.event_id = e.id 
        AND ed.start_date >= CURRENT_DATE()) 
+0

votre connaissance de ces requêtes montre mon ignorance comme toujours – kalpaitch

2

Vous pouvez simplement faire où pas comme

SELECT * FROM events WHERE events.ID NOT IN 
(
your current query here (but only select the id) 
) 
0

Je sais que c'est un peu en retard, mais je déteste les sous-requêtes et je me demande pourquoi cela ne pouvait pas être simplement fait avec un LEFT JOIN?

SELECT events.id AS id, events.picture, events.name, events.venue, events.city des événements LEFT JOIN event_dates SUR events.id = event_dates.event_id ET event_dates.start_date> = NOW() WHERE événement_dates.ID est null ORDER BY événements.id DESC; L'élément clé est de mettre le test de date dans les critères JOIN et non dans la clause WHERE. Je crois que c'est plus efficace, surtout si vous avez un index sur la colonne event_dates start_date?

Questions connexes