2014-09-17 9 views
0

Dans ma base de données, il y a quatre types d'individus, youngOrc, oldOrc, youngHuman, oldHuman.Requête MySQL imbriquée où condition

Un individu appartient à un type conditionnel à une plage de dates. Ainsi, je tableaux comme celui-ci pour chaque type:

 
youngOrcList 
------------------- 
individual_id, 
start_date, 
end_date 

Cela signifie que le gars avec individual_id est un youngOrc entre le début et la date de fin. Il peut être quelque chose d'autre en dehors de cette gamme. De même, j'ai une table youngHuman.

Maintenant, la table d'intérêt réel que je veux filtrer est des événements:

 
events 
------------------ 
source_individual_id 
target_individual_id 
event_date 

table des événements enregistre tous les événements entre deux individus dans mon royaume. Je veux filtrer de sorte que je sélectionne seulement events entre youngOrc et youngHuman.

Il s'agit donc d'une condition de tri "imbriquée", où j'ai besoin des deux events.source_individual_id IN youngOrcList et events.event_date BETWEEN youngOrcList.start_date AND youngOrcList.end_date. Comment faire ce travail?

(En outre, toute suggestion concernant un meilleur titre serait génial. Je ne sais même pas comment appeler cela et donc incapable de Google efficace.)

+0

Qu'avez-vous essayé jusqu'à présent? En outre, cela vous aidera si vous fournissez des exemples de données et des résultats attendus. – Bulat

+0

Il semble que vous ayez un mauvais schéma. Pour moi, il n'y a aucune raison d'avoir 4 séparatables pour ces classes d'individus. Pourquoi ne pas simplement une seule table avec tous les individus. Vieux/jeune est vraiment juste une propriété de l'individu (et je suppose que cela pourrait changer au fil du temps - alors qu'est-ce que vous allez déplacer les individus d'une table à l'autre à mesure qu'ils vieillissent dans votre régime actuel?). L'humain et l'orc pourraient également être considérés comme une propriété de l'individu. Pourquoi ne pas simplement avoir des individus et des événements qui se rapportent à des individus? –

+0

Les objets youngOrcList sont des tableaux que je crée moi-même pour faciliter la requête. Le schéma réel a une table qui mappe les individus à leurs types conditionnellement à la plage de dates comme vous l'avez dit. Est-ce que l'utilisation de cette table serait plus facile pour moi? – Heisenberg

Répondre

0

Vous pouvez utiliser rejoindre sur les tables. Ils peuvent être réunis sur un champ individual_id donc alors la seule condition à gauche pour WHERE clause sera la condition de date:

SELECT * 
FROM youngOrcList AS o 
JOIN events AS e ON e.source_individual_id = o.individual_id 
JOIN youngHumanList AS h ON h.individual_id = e.target_individual_id 
WHERE e.event_date BETWEEN o.start_date AND o.end_date 
AND e.event_date BETWEEN h.start_date AND h.end_date 

Sinon, la condition WHERE pourrait être:

WHERE e.event_date > MAX(o.start_date, h.start_date) 
AND e.event_date < MIN(o.end_date, h.end_date) 
1

Cela vous donnera tous événements entre youngOrc et youngHuman:

SELECT * 
FROM 
Events e 
WHERE EXISTS (
     SELECT * FROM youngHumanList 
     WHERE individual_id IN (e.source_individual_id, e.target_individual_id) 
      AND e.event_date BETWEEN start_date AND end_date) 
    AND EXISTS (
     SELECT * FROM youngOrcList 
     WHERE individual_id IN (e.source_individual_id, e.target_individual_id) 
      AND e.event_date BETWEEN start_date AND end_date) 
+0

Pourriez-vous expliquer comment cela fonctionne? Premièrement, je pensais que 'IN' devait être suivi d'une sous-requête' SELECT'. Je ne m'attendais pas à ce que 'IN (e.source_individual_id, e.target_individual_id)' fonctionne (c'est le cas). Deuxièmement, 'e.event_date BETWEEN start_date AND end_date' - comment puis-je savoir que' event_date' est associé à 'individual_id' en question? – Heisenberg

+1

L'opérateur 'IN' accepte une liste de valeurs ainsi que des sous-requêtes. Vous pouvez donc écrire 'WHERE a IN (1, 2, 3)'. Quant à 'event_date', il provient toujours de l'enregistrement en cours dans le jeu d'enregistrements Events. Donc les deux clauses existent auront la même valeur e.event_date, mais nous cherchons l'existence d'Orc et d'Human séparément et seulement si les deux existent pour un évènement nous retournons l'enregistrement – Bulat

+0

Donc, même si 'events' a des millions de lignes, dans chaque L'itération, 'e.source_individual_id',' e.target_individual_id', et 'e.event_date' regardent tous la même ligne? – Heisenberg