2010-12-23 5 views
0

J'ai deux tables contenant des informations sur le produit et des variations de produit. J'essaye de lister tous les produits, et c'est des variations de couleurs.Requête de groupe Mysql

Les produits de la table contient des informations générales est sur le produit (nom, description, permis, etc.)

Le tableau product_attributes contient les différentes options du produit (couleur, taille, etc. prix)

I J'essaie d'obtenir tous les produits disponibles, et si le produit est disponible en deux couleurs, il devrait apparaître comme deux listes. Malheureusement ma requête ci-dessous liste beaucoup plus d'options, car il y aura aussi une rangée pour chaque combinaison de taille.

SELECT pa.price, pa.color, p.id, p.url_key, p.name FROM product_attributes AS pa INNER JOIN products AS p ON pa.product_id = p.id && p.active = 1 

Est-ce que quelqu'un a une idée de la façon la plus intelligente et la plus efficace d'y parvenir?

J'espère que vous comprenez ma question

Merci à l'avance,

Cordialement!

id mediumint(7) NO PRI NULL auto_increment 
type tinyint(3) NO  1  
url_key varchar(54) NO  NULL  
name varchar(48) NO  NULL  
description text NO  NULL  
weight float NO  0  
active tinyint(3) NO  0  
in_feed tinyint(3) NO  0  
tax_class tinyint(3) NO  0  
meta_title varchar(48) NO  NULL  
meta_keywords varchar(48) NO  NULL  
meta_description text NO  NULL  
manage_stock tinyint(3) NO  0  
attribute_designers_id mediumint(7) NO  0  
attribute_size_family_id mediumint(7) NO  0 

id mediumint(7) NO PRI NULL auto_increment 
product_id mediumint(7) NO MUL NULL  
sku varchar(48) NO  NULL  
price float NO  NULL  
special_price float NO  0  
special_price_from_date datetime NO  NULL  
special_price_to_date datetime NO  NULL  
cost float NO  0  
new_from_date datetime NO  NULL  
new_to_date datetime NO  NULL  
attribute_colors_id mediumint(7) NO  NULL  
color varchar(24) NO  NULL  
attribute_sizes_id mediumint(7) NO  NULL  
quantity mediumint(7) NO  0 
+0

J'ai essayé de GROUP BY attribut_colors_id, donc j'obtiens une couleur unique pour chaque produit, puis en ignorant les tailles. Mais cela me donne des couleurs uniques pour tous les produits. par exemple. Si j'ai une couleur jaune pour le produit 1, cela n'apparaîtra qu'une seule fois et ne montrera pas le produit 7 qui a aussi une couleur jaune. – Kristian

Répondre

1

Vous devez ajouter un groupe par:

SELECT pa.price, pa.color, p.id, p.url_key, p.name 
FROM product_attributes AS pa 
INNER JOIN products AS p 
ON pa.product_id = p.id && p.active = 1 
GROUP BY p.id, pa.color 

Notez que votre colonne pa.price fait probablement aucun sens ici car le prix dépend certainement de la taille, mais vous ne savez pas quelle taille le prix est pour.

+0

Merci. C'était deffintly la bonne façon de grouper! En fait dans ce cas, le prix ne dépend pas de la taille, seulement par la couleur :) – Kristian

+0

@kris: OK, alors la requête que j'ai posté devrait vous donner le résultat correct. Notez que cette requête fonctionne dans MySQL mais * ne fonctionnera pas comme dans la plupart des autres bases de données: http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html. Dans les autres bases de données, vous devez ajouter les cinq colonnes au GROUP BY. –