2012-01-21 8 views
0

今、私は4つのテーブルがあります。EAVのクエリとテーブル

table categories: 
-id 
-category 

table products: 
-id 
-product 
-price 
-image 

table attributes: 
-id 
-attribute 
-product_id 

table values: 
-product_id 
-attribute_id 
-value 

を私はしてクエリを実行しています:

SELECT `id`, `product`, `price`, `image` FROM `products` WHERE `category_id` = $category->id 

は、今私は、このカテゴリの製品の配列を持って、それはプロパティです取得する必要があります: 次のクエリ:

SELECT `products`.`id` AS `product_id`, 
`attributes`.`attribute`, 
`values`.`value` 
FROM `products` LEFT JOIN `attributes` ON (`attributes`.`product_id` = `products`.`id`) 
LEFT JOIN `values` ON (`values`.`product_id` = `products`.`id` 
AND `values`.`attribute_id` = `attributes`.`id`) 
WHERE `products`.`id` IN ($ids) 

そしてそれが値を持つ属性を取得だが、私は一つのことについて思ったんだけど:0123をの列をtable attributesに取り除いて、その列のない属性と値を取得できる場合は、私はしたいものの

table attributes 
-id 1 
-attribute Weight 
-product_id 1 

-id 2 
-attribute Weight 
-product_id 2 

:今、それは例えば複製属性の全体の束があります私の英語のため

-id 1 
-attribute Weight 

申し訳ありません私のポストの一部がより詳細な説明が必要な場合は、今

を私に聞かせてください
+0

'product'テーブルの説明から' category_id'がありません。 –

+0

EAVの限界を脇に置くと、異なる製品が異なる属性(表 '属性 'に格納されている属性)を持つことができることを示唆しています。このような機能が欲しくないなら、@ vuceticaのアプローチを使うことができます。 –

答えて

0

あなたの属性をプロダクト特有のものにするかどうかによって異なりますが、明らかにそうしないでください。また、属性テーブルに値テーブルがある場合は、値テーブルにproduct_idは必要ありません。

table categories: 
-id 
-category 

table products: 
-id 
-product 
-price 
-image 
-category_id 

table attributes: 
-id 
-attribute 
-product_id 

table values: 
-attribute_id 
-value 

実は、私はそれより多くの簡単なEAVになるだろう:

table categories: 
-id 
-category 

table products: 
-id 
-product 
-price 
-image 
-category_id 

table attributes: 
-id 
-product_id 
-attribute 
-value 

そして、あなたのクエリは次のようになります。

SELECT id, product, price, image, attribute, value 
FROM products 
    INNER JOIN attributes ON products.id = attributes.product_id 
WHERE products.category_id = :category_id 
彼らは似ているのであれば、あなたのテーブルには、より多くの意味を作ります

インデックスが適切であることを確認してください。また、製品IDを選択してINに入れる方法は、悪い習慣です。

+0

私はintance 10の属性がある場合? – nazarov

+0

これは10行を返します。あなたはそれを望んでいないのですか? –

+0

これは、OPを製品ごとに1つのカテゴリに制限します。それは批判ではなく、観察です。 –

関連する問題