2010-11-20 4 views
2

Disons que j'ai le tableau suivant avec des centaines de jouets de différentes couleurs ...MySQL requête avec plusieurs LIMITES

--------------------------- 
    ITEM | COST | COLOR 
--------------------------- 
    1 | 12.00 | BLUE 
    2 | 10.98 | RED 
    3 | 9.34 | BLUE 
    4 | 11.33 | WHITE 
    5 | 8.00 | YELLOW 
    . | . | . 
    . | . | . 
    . | . | . 

Si je voulais sélectionner les trois jouets bleus prix le plus bas, je pouvais d'écrire des cours. ..

SELECT * FROM TOYS WHERE Color = 'BLUE' ORDER BY COST LIMIT 3; 

Mais, est-il un moyen que je peux choisir le un certain nombre de jouets jaune, blanc et bleu le plus bas prix, comme si je disais uniquement spécifié ...

SELECT * FROM TOYS WHERE COLOR = 'YELLOW' (LIMIT 1) AND COLOR = 'WHITE' (LIMIT 3) AND COLOR = 'BLUE' (LIMIT 2) ORDER BY COST 

Est-il possible de faire cela entièrement dans MySQL sans passer par le tableau en PHP?

+0

Je suppose que ce qui suit * ne * fonctionnerait pas car il mâcherait des ressources: Exécuter la requête complexe sans la clause WHERE finale (par exemple, " COULEUR "ci-dessus); stocker les résultats dans une table temporaire; puis exécutez une requête beaucoup plus simple contre la table temporaire? Puisque le site Web pourrait potentiellement avoir des centaines, voire des milliers, d'utilisateurs simultanés, il y a une chance que cette requête soit exécutée des centaines de fois par seconde. Ai-je raison de supposer qu'il y a beaucoup plus de frais généraux dans la création et la suppression de tables temporaires que de multiples requêtes complexes? –

Répondre

5

Pourquoi pas?

select * from toys where color = 'Yellow' (LIMIT 1) 
UNION 
select * from toys where color = 'White' (LIMIT 3) 
UNION 
select * from toys where color = 'Blue' (LIMIT 2) 
+0

J'ai utilisé l'exemple du jouet simple pour illustrer ce que j'essaie d'accomplir. La vraie requête, à laquelle j'ai besoin d'appliquer la technique, a quelques requêtes imbriquées, des jointures, etc. C'est assez complexe. –

+0

J'ai accepté cette réponse parce que Sparky a répondu à la question que j'avais posée à l'origine. Je n'avais pas noté la complexité de la requête dans mon exemple original. –

-1

Pour moi, la solution est de créer 3 différentes requêtes et fusionner les 3 tableaux en PHP

+2

L'OP demande: _ "Est-il possible de faire cela entièrement en MySQL sans marcher dans le tableau en PHP?" _ – jwueller

+1

lire clairement la question ..;) – klox

+0

Je n'ai pas suggéré de marcher à travers, j'ai suggéré de fusionner – riotera

0

Eh bien, à mon humble avis, on vous a donné 2 options ici, cependant, je vais encore en fusionnant les tableaux qu'il ne prendra pas tant de ressources temps/système comme UNION. (Basé sur ce que vous avez dit que la table a BEAUCOUP de rangées)

+0

Mon nombre de lignes maximum est probablement de 50K. La principale chose que j'essaie d'aborder est que la vraie requête, contrairement à mon exemple, est très complexe, donc je voulais trouver un moyen d'éviter de l'exécuter plusieurs fois. –