2010-08-12 10 views
2

Ce que j'aimerais faire est de chercher dans un tableau avec deux valeurs différentes, c'est difficile à expliquer, donc je vais juste donner un exemple.Requête Mysql avec différentes recherches dans la même table

Tableau: les gens

+----------------+ 
| id  name | 
|----------------| 
| 1  Bob  | 
| 2  Jack | 
| 3  Waly | 
| 4  Alex | 
++++++++++++++++++ 

Tableau: animaux

+------------------------------------------+ 
| id person key   value  | 
|------------------------------------------| 
| 1 1   dog   Terrier  | 
| 2 1   dog   Shepherd  | 
| 3 1   bird   African Grey | 
| 4 3   cat   Toyger  | 
| 5 3   cat   Korat  | 
| 6 2   dog   Terrier  | 
++++++++++++++++++++++++++++++++++++++++++++ 

Par exemple: Je voudrais être en mesure de sélectionner uniquement les personnes qui ont un chien qui est un terrier et un oiseau africain donc il devrait retourner 1 (Bob). Je dois être en mesure d'ajouter et de supprimer des paramètres que je veux juste que les gens qui ont un chien Terrier devraient retourner 1 (Bob) et 2 (Jack).

J'ai essayé SQL de base, mais je l'ai fait fonctionner parce que quand vous limitez la clé, vous pouvez en rechercher une autre. La requête suivante est ce que j'ai essayé et je veux revenir: 1 (Bob). Si possible, je voudrais garder toutes les rangées d'animaux dans la même table afin que je n'ai pas à les séparer. Merci pour toute votre aide!

Répondre

5

Vous aurez besoin de plusieurs recherches de table, chacune recherchant un animal en particulier. Par exemple, en utilisant une double jointure:

select * 
from people p 
join animals a1 
on  a1.person = p.id 
join animals a2 
on  a2.person = p.id 
where a1.key = 'dog' and a1.value like '%Terrier%' 
     and a2.key = 'bird' and a2.value like '%African%' 

Ou un double existe:

select * 
from people p 
where exists 
     (
     select * 
     from animals a 
     where a.person = p.id 
       and a.key = 'dog' 
       and a.value like '%Terrier%' 
     ) 
     and exists 
     (
     select * 
     from animals a 
     where a.person = p.id 
       and a.key = 'bird' 
       and a.value like '%African%' 
     ) 
+0

la mine supprimée, c'est le chemin à parcourir. J'ai mal compris la question. –

+0

Je ne savais pas que vous pouviez faire cela, savez-vous que la méthode de la sorcière est plus rapide? – Scott

+0

@Scott: Ils devraient être plus ou moins équivalents. Seule la première requête fonctionne si vous devez sélectionner des champs de la table des animaux – Andomar

0
Select p.id, p.name 
from people p 
INNER JOIN animals a on p.id = a.person 
WHERE ((a.key ='dog' and a.value Like '%Terrier%') and (a.key = 'bird' and a.value Like '%African Grey%')) 
+0

Et que se passe-t-il si quelqu'un ajoute un enregistrement animal pour '(oiseau, terrier)' ou '(chien, gris africain)'? – Thomas

+0

Fait un changement basé sur le besoin pour les deux conditions à remplir. – websch01ar

+0

Thomas, nous pouvons ajouter des filtres supplémentaires dans chaque vérification. Nous avons juste besoin de garder les deux vérifications dans un(). – websch01ar

Questions connexes