この種のテーブルは、しばしばキー/値ストアと呼ばれます。これはプロパティの拡張可能なリストを処理する有効な方法ですが、使用するには少し面倒なことがあります。
このようなクエリでは、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
のようなものを探してビューを作成します。
を試してみてください。各プロパティ名は、プロパティエントリに従った異なるフィールドでなければなりません。 – apomene