2009-12-24 4 views
1

Je souhaite sélectionner distinct_series, mais je souhaite également toutes les autres colonnes.MySQL: Sélectionnez un champ distinct, mais obtenez également le reste des colonnes?

C'est ma requête telle qu'elle est:

SELECT DISTINCT product_series 
FROM cart_product 
WHERE product_brand = "everlon" 
AND product_type = "ring" 
AND product_available = "yes" 

Cela ne me donne product_series, je dois toutes les autres colonnes de cette ligne aussi. Si j'essaie de sélectionner plus que simplement product_series, je finis par obtenir des multiples de séries de produits.

Je veux est * tous les champs mais je veux le limiter afin que je reçois seulement 1 ligne par série de produits.

Je ne sais pas si je suis expliquais cela correctement alors laissez-moi donner un exemple:

si je

product_series product_id 
---------------------------- 
"seriesA"  230 
"seriesA"  231 
"seriesB"  232 
"seriesB"  233 

je recevrais toutes les colonnes, mais seulement 1 par product_series:

product_series product_id 
---------------------------- 
"seriesA"  230 
"seriesB"  232 

Comment puis-je faire cela?

Répondre

4
SELECT pi.* 
FROM (
     SELECT DISTINCT product_series 
     FROM cart_product 
     ) pd 
JOIN cart_product pi 
ON  pi.id = 
     (
     SELECT id 
     FROM cart_product po 
     WHERE product_brand = "everlon" 
       AND product_type = "ring" 
       AND product_available = "yes" 
       AND po.product_series = pd.product_series 
     LIMIT 1 
     ) 

Ceci sélectionnera un produit par série sans ordre particulier. Ajouter une condition ORDER BY dans la sous-requête pour définir l'ordre.

Vous pouvez également lire cet article dans mon blog:

+0

+1 bonne réponse! – James

+0

Merci, j'ai fini par en avoir besoin pour être aussi celui avec le prix le plus bas, donc je pourrais montrer un prix de départ pour chaque série, donc pouvoir commander par était bon merci. –

1

Semble que vous voulez GROUP BY à la place.

+0

Merci, changé ma sélection pour * puis ajouté par groupe product_series à la fin. Cela semble avoir fait l'affaire. Merci! et joyeux noël! –

+0

Joyeux Noël à vous aussi, Mr. Isaacks! Excellent travail ici. – Sampson

+0

Notez que le fait que les résultats renvoyés par un GROUP BY avec des colonnes cachées appartiennent à la même ligne n'est pas garanti. C'est le cas avec la mise en œuvre actuelle, mais peut changer à tout moment dans le futur. – Quassnoi

3

Vous pouvez utiliser GROUP BY pour cela. Mais veuillez vous rendre compte qu'il doit y avoir un moyen d '«aplatir» le groupe de plusieurs ID_produit dans une seule valeur. Ceci est réalisé avec une fonction d'agrégation, comme MIN, MAX, ou GROUP_CONCAT():

SELECT product_series, MAX(product_id) max_product_id 
FROM cart_product 
WHERE product_brand = 'everlon' 
AND product_type = 'ring' 
AND product_available = 'yes' 
GROUP BY product_series 

BTW: s'il vous plaît ne pas utiliser des guillemets doubles dans SQL pour délimiter les chaînes. Dans tous les SGBDR mais MySQL, le guillemet peut être utilisé pour délimiter les identifiants, et seules des guillemets simples peuvent être utilisés pour délimiter les littéraux de chaîne.

+0

L'exemple de sortie répertorie le minimum id_produit, pas le maximum –

+0

+1. Pas la solution idéale à la question, mais une grande expression de la façon d'utiliser GROUP BY. – James

+0

@OMG poneys: peut-être, mais l'OP n'a jamais dit qu'ils se souciaient du produit particulier qu'ils voulaient voir. Pour moi, mentionner MIN dans le texte semble suffisant pour commencer à penser à ce que vous voulez vraiment. –