1

たとえば、次の 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
4

3 に答える 3

2

ここには、ニーズを満たすクエリがいくつかあります。しかし、ご覧のとおり、それらはすべて独立しています。そのため、コメントで正確に何が必要かを尋ねます。

さらに多くのテストを行うには、提供されたサンプル データを使用して、このSQL Fiddle サンプル コードを使用します。

EDITすべての条件とすべての結果を 1 つのセットに含めるための新しいクエリを追加しました。ここで SQL Fiddle のサンプル コードを確認してください。

SELECT w.name,ref,property_id,value 
  FROM watch w
  JOIN property p on w.id = p.id
  JOIN property_material pm on p.id = pm.property_id 
 WHERE (p.id = 1 AND pm.value > 100)
    OR (p.id = 2 AND pm.value IN ('steel','plastic'))
    OR (p.id = 3 AND pm.value IN ('leather','rubber'))
    OR (p.id = 4 AND pm.value = 'quartz');

独立したクエリ:

SELECT w.name Watch_name, p.name Property_name, pm.value Property_value
  FROM watch w
  JOIN property_material pm ON w.id = pm.watch_id
  JOIN property p ON p.id = pm.property_id
 WHERE p.id = 1
   AND pm.value > 100;

WATCH_NAME  PROPERTY_NAME     PROPERTY_VALUE
tissot      water_resistant   200

別のもの:

SELECT w.name Watch_name, p.name Property_name, pm.value Property_value
  FROM watch w
  JOIN property_material pm ON w.id = pm.watch_id
  JOIN property p ON p.id = pm.property_id
 WHERE p.id = 2
   AND pm.value IN ('steel','plastic');

WATCH_NAME   PROPERTY_NAME   PROPERTY_VALUE
tissot      material_body      steel
addidas     material_body      plastic
nike        material_body      steel

別のもの:

SELECT w.name Watch_name, p.name Property_name, pm.value Property_value
  FROM watch w
  JOIN property_material pm ON w.id = pm.watch_id
  JOIN property p ON p.id = pm.property_id
 WHERE p.id = 3
   AND pm.value IN ('leather','rubber');

WATCH_NAME   PROPERTY_NAME      PROPERTY_VALUE
tissot      material_bracelet      leather
addidas     material_bracelet      leather
nike        material_bracelet      rubber

別のもの:

SELECT w.name Watch_name, p.name Property_name, pm.value Property_value
  FROM watch w
  JOIN property_material pm ON w.id = pm.watch_id
  JOIN property p ON p.id = pm.property_id
 WHERE p.id = 4
   AND pm.value = 'quartz';

WATCH_NAME   PROPERTY_NAME   PROPERTY_VALUE
tissot         watch_type       quartz
addidas        watch_type       quartz
于 2012-10-25T07:38:06.053 に答える
1

私が知っている唯一の可能性は、次のように、各プロパティのプロパティ テーブルに結合することです (指定された例を変更しました)。

select w.*, pm1.value,pm1.pid ,pm2.value,pm2.pid
    from watch w 
        join property_material pm1 on w.id = pm1.watch_id AND pm1.pid = 1 and pm1.value = '100'
        join property_material pm2 on w.id = pm2.watch_id AND pm2.pid = 2 and pm2.value IN ('Steel','Lather');
于 2012-10-25T07:47:57.437 に答える
0
select watch_table.id,watch_table.name,ref,property_id,value from watch_table join        property_table on watch_table.id=property_table.id
  join property_material on property_table.id=property_material.property_id 
 where WHERE property.id = 3 AND property_material.value IN ('leather','rubber');
于 2012-10-25T07:38:06.727 に答える