2011-07-15 14 views
0

表製品:条件(場所)mysqlの

id|name 
------- 
1 |computer 
2 |microwave 
3 |transl 

表のproduct_features:

feature   | id_product | feature_value 
------------------------------------ 
count_of_buttons | 1   | 1 
count_of_buttons | 2   | 2 
count_of_buttons | 3   | 1 
color   | 1   | white 
color   | 2   | white 
color   | 3   | black 

Plsは、どのようにボタン一つですべての白の製品を取得するには? ありがとうございます!

答えて

4
select product.* 

from product 
    join product_features as buttons 
    on buttons.id_product = product.id 
    join product_features as color 
    on color.id_product = product.id 

where buttons.feature_value = '1' 
    and buttons.feature = 'count_of_buttons' 

    and color.feature_value = 'white' 
    and color.feature = 'color'; 
-1

はproduct_featuresがp.id = pf.id pf.feature_value = '白' AND pf.count_of_buttons = 1

+1

'color'と' count_of_buttons'は同じ列の異なる行であり、同じ行の異なる列ではないため動作しません。 –

-1
select p.id, p.name from products p inner join product_features ON p.id=id_product where feature_value='white' and feature='color' and count_of_buttons=1 
+0

OPは、ボタンが1つしかない白い製品を求めました。これは白い製品しか与えません。 –

+0

@Michael:さらに悪いことに、テーブルに 'count_of_buttons'フィールドはありません... –

+0

@ypercubeそれは私のコメント以来編集されています。まだ動作しません。 –

1
ONをPF P がJOIN Productsから p.idを選択します
select 
    p.id 
    p.name 
from 
    products p 
    join (select * from product_features where feature = 'color') colors on (p.id=colors.id_product) 
    join (select * from product_features where feature = 'count_of_buttons') buttons on (p.id=buttons.id_product) 
where 
    colors.feature_value = 'white' 
    and buttons.feature_value = 1 

product_featuresテーブルを再編成して、各機能ごとに別々の列があるようにすることもできます(つまり、color列とcount_of_buttons列)を使用すると、製品ごとに1つの行が表示されます。実際、それはすべて製品テーブルにある可能性があります。

+0

'product_features'テーブルは、** EAV **(Entity-Attribute-Value)アプローチの一例です。ウィンドウ関数は必要ありません。通常、クエリはこのアプローチで(同じテーブルに)多数の結合を必要とします。 –

+0

このアプローチはコストがかかりません。特に大規模なテーブルの場合はそうでしょうか? REのウィンドウ関数は最初は意味をなさないようでしたが、今はどのように手軽に編集できるのでしょうか? – redbmk

+0

EAVの問題は、JOINのコストではありません。クエリに多数の結合を持たせるのは遅いかもしれませんが、インデックス作成では非常に高速かもしれません。同じ列に多くの異なるデータ型を格納する必要がある場合など、他の問題があります。また、実行することは困難ではないにしても難しい参照整合性制約もあります。 –