たとえば、次の 3 つのテーブルがあります。
監視台
id(int) name(varchar) ref(int)
1 tissot 1234567
2 addidas 7654321
3 nike 8976543
プロパティ テーブル
id(int) name(varchar)
1 water_resistant
2 material_body
3 material_bracelet
4 watch_type
property_material テーブル
watch_id property_id value
1 1 200
1 2 steel
1 3 leather
1 4 quartz
2 1 50
2 2 plastic
2 3 leather
2 4 quartz
3 1 100
3 2 steel
3 3 rubber
3 4 mechanical
たとえば、プロパティを持つすべての時計を取得したい:
- 耐水性 >= 100
- material_body = スチールまたはプラスチック
- material_bracelet = 革またはゴム
- 時計の種類 = クォーツ。
クエリを作成してください。プロパティは約100になる可能性があります。理想的には、結果を取得したい:
watch_id name ref water_res mat_body mat_bracelet watch_type
1 tissot 1234 200 steel leather quartz
私は試しています:
select
w.*, pm.value,pm.property_id
from
watch w
join
property_material pm
on w.id = pm.watch_id
where
pm.pid in (1,2,3)
and
pm.value in ('100','Steel','Leather');
しかし、このクエリはすべてのレコードを返します。値が Steel または Leather の場合、たとえば、material_body が Steel で material_bracelet が Leather である必要があります。
更新: このクエリについてどう思いますか?
select
name, ref
from
watch w
join
(SELECT w.id
FROM watch w
JOIN property_material pm on w.id = pm.watch_id
WHERE (pm.property_id = 1 AND pm.value > 100)
OR (pm.property_id = 2 AND pm.value IN ('steel','plastic'))
OR (pm.property_id = 3 AND pm.value IN ('leather','rubber'))
OR (pm.property_id = 4 AND pm.value = 'quartz')
Group by w.id
Having count(*) = 4) as t1
on t1.id = w.id;
最終更新:
select
w.name,
max(if(pm.property_id='1',pm.value,'')) water_resistant,
max(if(pm.property_id='2',pm.value,'')) material_body,
max(if(pm.property_id='3',pm.value,'')) material_bracelet,
max(if(pm.property_id='4',pm.value,'')) watch_type
from
watch w
join
(
SELECT w.id
FROM watch w
JOIN property_material pm on w.id = pm.watch_id
WHERE (pm.property_id = 1 AND pm.value > 100)
OR (pm.property_id = 2 AND pm.value IN ('steel','plastic'))
OR (pm.property_id = 3 AND pm.value IN ('leather','rubber'))
OR (pm.property_id = 4 AND pm.value = 'quartz')
Group by w.id
Having count(*) = 4
) as t1 on t1.id = w.id
join property_material pm on w.id = pm.watch_id
GROUP BY w.id