2011-01-03 2 views
0

Auparavant, je demandais de filtrer une colonne pour plusieurs valeurs où toutes doivent être présentes dans la colonne, sinon aucun résultat ne devrait être donné. J'ai reçu une bonne réponse, mais cette fois ma demande a quelque peu changé et j'ai besoin de quelque chose de différent. J'ai donc besoin de filtrer une colonne pour les valeurs de couple et d'afficher les résultats uniquement si toutes ces valeurs sont présentes ET toutes ces valeurs sont liées à une valeur dans une autre colonne.Filtrage de plusieurs valeurs sur une colonne en fonction des valeurs d'une autre colonne

table Exemple:

+ ---- + -------- + ---------- +
| id | Fruit | Couleur |
+ ---- + -------- + ---------- +
| 1 | pomme | vert |
| 2 | pomme | jaune |
| 3 | banane | vert |
| 4 | banane | jaune |
| 5 | mangue | vert |
+ ---- + -------- + ---------- +

E.g. Si les valeurs 'vert et jaune' sont soumises, seuls les fruits qui ont ces deux couleurs doivent être dans le jeu de résultats, dans ce cas 'pomme' et 'banane'. Toutes les autres lignes doivent être ignorées. J'utilise MySQL avec php.

Exemple "mauvais code":

select Fruit FROM table WHERE Color = green AND Color = yellow 

doit retourner les 4 premiers rangs mais pas 5.

Merci
Andrew

Répondre

0

En supposant que vous avez besoin chaque nom de fruit qu'une seule fois:

SELECT Fruit FROM table WHERE Color IN ('green', 'yellow') 
    GROUP BY Fruit HAVING COUNT(*) >= 2 
+0

Bien que les trois réponses aient donné le même résultat correct, celui-ci me convenait le plus. Merci – Andrew

0

Eh bien, vous aurez envie de se joindre à la table sur lui-même.

SELECT a.Fruit 
FROM table AS a 
JOIN table AS b ON a.Fruit = b.Fruit 
WHERE a.Color = 'green' 
    AND b.Color = 'yellow' 

Mais, au contraire, je vous suggère correctement normalizing vos données, ce qui rendrait cette requête beaucoup plus facile (et beaucoup plus efficace) ...

+0

En fait, ce tableau « exemple » est un « jeu de résultats virtuel » généré en se joignant à d'autres tables, donc je ne peux pas normaliser davantage (bien au moins ma connaissance). Merci pour la réponse, je vais essayer votre code – Andrew

+0

Ce n'est pas clair pour moi pourquoi vous croyez que les données de l'échantillon ne sont pas normalisées? –

+0

@Larry: Assez simple. La couleur est clairement un élément dupliqué, elle n'est donc pas qualifiée de [2ème forme normale] (http://en.wikipedia.org/wiki/Second_normal_form). (La même chose pourrait être dite pour les fruits aussi). Je ne dis pas que ** a besoin ** d'être entièrement normalisé à 100%, juste que ce n'est certainement pas la 2ème normale ou plus grande ... – ircmaxell

1

Alors, dans ce cas, vous devez tout (fruits, couleur) paires qui apparaissent exactement deux fois. Vous pouvez utiliser un compte pour filtrer que sur, comme ceci:

select fruit from( select fruit,count(1) as freq from table where color in (green,yellow) group by 1 )freq_table where freq=2;

Ceci, bien sûr, suppose que non (fruit, couleur) paire apparaît plus d'une fois. Si c'est le cas, alors vous pouvez vouloir un troisième niveau de sous-requête où vous sélectionnez des fruits, la couleur du groupe de table par 1,2.

+0

Eh bien, pedantically il pourrait être plus de 2, puisqu'il ne semble pas y avoir des contraintes sur les données (donc en théorie il pourrait y avoir plus de 2 lignes résultantes, dont certaines sont dupliquées). Donc, je voudrais changer «WHERE freq = 2» à «WHERE freq> = 2» (où 2 est le nombre de valeurs dans la clause «IN») ... – ircmaxell

+0

Il apparaît définitivement fruits, paire de couleurs plus d'une fois. Merci de votre aide, je vais le tester. – Andrew

Questions connexes