1

たとえば、商品のプロパティを含むテーブルがあります。各製品は、同じプロパティの複数の値を持つことができます。

goods_id | property | value  

1        |color     | red  
1        |size      | 100  
1        |size      | 200  
2        |color     | red  
2        |color     | green  
2        |size      | 200

色が赤でサイズが100のすべてのアイテムを検索する必要がある場合は、次のクエリを実行します。

SELECT goods_id FROM goods
WHERE (property = 'color' AND value = 'red') OR
      (property = 'size' AND value = '100')
GROUP BY goods_id
HAVING COUNT(goods_id) = 2

MYSQL は、goods_id = 1 を返します。

しかし、色が赤または緑でサイズが100のすべてのアイテムを検索する必要がある場合、次のクエリ

SELECT goods_id FROM goods
WHERE (property = 'color' AND value IN ('red', 'green')) OR
      (property = 'size' AND value = '100')
GROUP BY goods_id
HAVING COUNT(goods_id) = 2

ID 1 と 2 を返しますが、1 だけにする必要があります。
正しい結果を返すように 2 番目のクエリを変更するにはどうすればよいですか? アドバイスをありがとう

4

2 に答える 2

1

HAVING 条件を次のように変更します。

HAVING COUNT(DISTINCT property) = 2
于 2013-06-20T09:41:24.817 に答える
0

こちらがお席で御座います:

goods_id | property | value
  1       |    color    | red
  1       |    size      | 100
  1       |    size      | 200
  2       |    color    | red
  2       |    color    | green
  2       |    size      | 200

これが最初のクエリです。

  SELECT goods_id FROM goods
  WHERE (property = 'color' AND value = 'red') OR
  (property = 'size' AND value = '100')
  GROUP BY goods_id
  HAVING COUNT(goods_id) = 2

最初のHAVING句がなく、WHEREステートメントのみがないと、結果が得られます。

  1       |    color    | red
  1       |    size      | 100
  2       |    color    | red

しかし、今 HAVING 句を使用すると、goods_id のカウントが 2 だけが必要になるため、残りは次のとおりです。

  1       |    color    | red
  1       |    size      | 100

そして、それをグループ化する1ので、表示してから残るだけですgoods_id

2 番目のクエリでは、次のようになります。

 SELECT goods_id FROM goods
 WHERE (property = 'color' AND value IN ('red', 'green')) OR
  (property = 'size' AND value = '100')
 GROUP BY goods_id
 HAVING COUNT(goods_id) = 2

条件に基づいて、HAVING必要な句を使用せずに、値 (ORを意味する)またはOR propertyofとof の値を使用します。したがって、次の結果が得られます。colorredgreenpropertysizevalue100

goods_id | property | value
  1       |    color    | red
  1       |    size      | 100
  2       |    color    | red
  2       |    color    | green

そして、当然のことながらのHAVING句で、との 2つが結果として生じます。COUNT(goods_id)=2goods_id12

つまり、クエリの結果は正しいです。

したがって、結果が1つだけ必要な場合は、おそらく使用できます

LIMIT 1

または、おそらくクエリが間違っているため、その一部を変更する必要があります。

于 2013-06-20T10:02:29.807 に答える