2010-05-17 5 views
1

J'ai là table mysql:attribut select mysql

**product (id,name)** 
1 Samsung 
2 Toshiba 
3 Sony 

**attribute (id,name,parentid)** 
1 Size 0 
2 19" 1 
3 17" 1 
4 15" 1 
5 Color 0 
6 White 5 
7 Black 5 
8 Price 0 
9 <$100 8 
10 $100-$300 8 
11 >$300 8 

**attribute2product (id,productid,attributeid)** 
1 1 2 
2 1 6 
3 2 2 
4 2 7 
5 3 3 
6 3 7 
7 1 9 
8 2 9 
9 3 10 

Et les a énumérés aime:

**Size** 
-- 19" (2) 
-- 17" (1) 
-- 15" (0) 

**Color** 
-- White (1) 
-- Black (2) 

**Price** 
-- <$100 (1) 
-- $100-$300 (1) 
-- >$300 (1) 

S'il vous plaît aidez-moi la requête mysql à la liste le nom d'attribut et compter le produit numéro que cet attribut avoir. EG: Quand sélectionnez Taille 19" (attribute.id 2)

**Size** 
-- 19" 

**Color** 
-- White (1) 
-- Black (1) 

**Price** 
-- <$100 (1) 
-- $100-$300 (1) 

Cette questionnera à attribute2product >> sélectionner la ProductID >> requête suivante pour sélectionner un autre attribut de cette ProductID et afficher le nom de l'attribut, le nombre de prod . ce nom d'attribut ont maintenant ... (comme Magento)

Merci,

+0

Pouvez-vous poster le code pour les énumérer? Cela pourrait aider. – sirhc

+0

@Chris Chua: Je veux apprendre la requête mysql (sélection, jointure, table EAV ..) comme le filtre d'attributs de produits de Magento. –

+0

Should 'White' et 'Black' ne devraient pas avoir l'id parent' 5'? – poke

Répondre

3

J'ai modifié la requête Cela devrait être ce que vous en fonction de vos mises à jour:

SELECT attribute.name AS attributename, COUNT(*) AS numofproducts FROM product 
    INNER JOIN attribute2product ON attribute2product.productid = product.id 
    INNER JOIN attribute ON attribute.id = attribute2product.attributeid 
    WHERE product.id IN 
    (
    SELECT p.id FROM product AS p 
    INNER JOIN attribute2product AS a2p ON a2p.productid = p.id 
    WHERE a2p.attributeid = 2 
    ) 
    GROUP BY attribute.id, attribute.name; 

Ba sed sur vos données ci-dessus, je suis arrivé:

attributename numofproducts 
     19"    2 
     White    1 
     Black    1 
     <$100    2 

Pour plusieurs attributs (based a more knowledgeable expert Quassnoi's blog article):
J'ai enlevé table de produit car il est pas nécessaire ici

SELECT attribute.name AS attributename, COUNT(*) AS numofproducts 
FROM attribute2product 
    INNER JOIN attribute ON attribute.id = attribute2product.attributeid 
    WHERE attribute2product.productid IN (
     SELECT o.productid 
     FROM (
     SELECT productid 
     FROM (
      SELECT 2 AS att 
      UNION ALL 
      SELECT 6 AS att 
     ) v 
     JOIN attribute2product ON attributeid >= att AND attributeid <= att 
     ) o 
     GROUP BY o.productid 
     HAVING COUNT(*) = 2 
    ) 
    GROUP BY attribute.id, attribute.name 

2, 6 se réfèrent à 19" et White, respectivement. COUNT(*) = 2 doit correspondre à 2 attributs. Plus d'attributs peuvent être ajoutés par ce qui suit à l'ajout de la table dérivée imbriquée:

  UNION ALL 
      SELECT <attributeid> AS att 

Comme on s'y attendait le résultat de la requête:

attributename numofproducts 
     19"    1 
     White    1 
     <$100    1 
+0

Cette première jointure interne doit être sur 'attribute2product.productid = product.id' –

+0

Impossible de filtrer lorsque vous sélectionnez un attribut avec votre requête, Chris Chua. Il affichera le nom de l'attribut que nous avons sélectionné. Quoi qu'il en soit, j'ai édité la Question et j'essaie de vous expliquer. S'il vous plaît aider! –

+0

J'ai manqué un 'ON' dans mon code, je l'ai juste ajouté. Il devrait retourner à la fois le nom de l'attribut sélectionné ainsi que le nombre de produits avec cet attribut. Pourriez-vous poster votre résultat ici si vous avez encore des problèmes? – sirhc