2016-08-31 11 views
2

私はclothes_propertiesと呼ばれるテーブルを持っていると行のいくつかは次のようになります。MySQLの、いくつかの行を超えるSQLクエリ

id product_id property_name property 
55 189000  color   blue 
56 189000  type   tshirt 
57 189000  size   medium 
58 189001  color   red 
59 189001  type   tshirt 
60 189001  size   medium 

私は何から正しいのproduct_idを選択することができるSQLクエリを作成したいですユーザーが検索します。ユーザーがtshirtとmediumを検索すると、SQLクエリーが返されます:189000 & 189001。ユーザーがtshirtとblueを検索した場合、この製品IDのみが返されます。189000。SQL照会を作成するにはどうすればいいですか?それは?

+0

を試してみてください。各プロパティ名は、プロパティエントリに従った異なるフィールドでなければなりません。 – apomene

答えて

0

property_nameの列は完全に無視しますか?

SELECT DISTINCT product_id 
FROM clothes_properties 
WHERE property IN ('tshirt', 'medium'); 

SELECT DISTINCT product_id 
FROM clothes_properties 
WHERE property IN ('tshirt', 'blue'); 
1

この種のテーブルは、しばしばキー/値ストアと呼ばれます。これはプロパティの拡張可能なリストを処理する有効な方法ですが、使用するには少し面倒なことがあります。

このようなクエリでは、product_idの値が基準のリストと一致するか、最初に最も一致するかの順に値が表示されます。 (http://sqlfiddle.com/#!9/7870b5/2/0

select count(*) matches, product_id 
    from prop 
where property in ('tshirt','medium') 
group by product_id 
order by 1 desc 

このクエリは、しかし、サイズ、色、種類の差の無知です。

サイズや色などを正確に一致させたい場合は、もう少し複雑になります。キー/値のプロパティテーブルをピボットするクエリから始めて、行を列に変換する必要があります。 (http://sqlfiddle.com/#!9/7870b5/3/0

select id.product_id, 
     color.property color, 
     type.property type, 
     size.property size 
from (select distinct product_id from prop) id 
left join prop color on id.product_id = color.product_id and color.property_name = 'color' 
left join prop type on id.product_id = type.product_id and type.property_name = 'type' 
left join prop size on id.product_id = size.product_id and size.property_name = 'size' 

あなたはその後、おそらくそうのように、仮想テーブルとして扱い、それを照会する必要があります。 (http://sqlfiddle.com/#!9/7870b5/4/0

select * 
    from (

     select id.product_id, 
       color.property color, 
       type.property type, 
       size.property size 
     from (select distinct product_id from prop) id 
     left join prop color on id.product_id = color.product_id and color.property_name = 'color' 
     left join prop type on id.product_id = type.product_id and type.property_name = 'type' 
     left join prop size on id.product_id = size.product_id and size.property_name = 'size' 
     ) allprops 
where size='medium' and color = 'blue' 

多くの開発者とDBAは、これは少し簡単にするためにallpropsのようなものを探してビューを作成します。

0

私はGROUP BYHAVINGを使用してこの操作を行います。

select product_id 
from clothes_properties 
where property_type = 'type' and property = 'tshirt' or 
     property_type = 'size' and property = 'medium' 
group by product_id 
having count(distinct property_type) = 2; 

注:あなたが与える製品の重複したプロパティタイプを持っていない場合distinctが必要とされていません。

あなたは一般的な何かを望んでいた場合、あなたが使用する可能性があります:

select product_id 
from clothes_properties 
where property_type = 'type' and (property = $type or $type = '') or 
     property_type = 'size' and (property = $size or $size = '') or 
     property_type = 'color' and (property = $color or $color = '') 
group by product_id 
having count(distinct property_type) = (($type <> '') + ($size <> '') + ($color <> '')); 
+0

最初の例を試してみましたが、小さなテーブルでテストすると完全に動作します。今より大きなテーブルでそれを試してみましょう。あなたの助けをありがとう! –

0

私はあなたのテーブルがひどく構造化されていると信じて、この

SELECT DISTINCT(product_id) FROM clothes_properties WHERE property IN ('tshirt','medium') group by product_id having count (distinct property) = 2

関連する問題