web-dev-qa-db-ja.com

MySQL複数のWhere句

このようなテーブルがあります:

id  image_id  style_id  style_value
-----------------------------------
1   45        24        red
1   45        25        big
1   47        26        small
1   45        27        round
1   49        28        rect

次の場合にimage_id列を取得します。

  • style_id = 24およびstyle_value = red
  • style_id = 25およびstyle_value = big
  • style_id = 26およびstyle_value = round

次のようなクエリを作成しました。

$query = mysql_query("SELECT image_id FROM list WHERE (style_id = 24 AND style_value = 'red') AND (style_id = 25 AND style_value = 'big') AND (style_id = 27 AND style_value = 'round')

しかし、結果を得ることができませんでした。このサンプルをORで作成すると、うまく機能します。しかし、私はこれをANDで行わなければなりません。私は両方の「赤、大きな、長方形」である画像IDが必要だからです。

Googleで多くの検索を行いましたが、解決策はありませんでした。

おかげで、

いい仕事をしてください。

25
Bugra YUKSEL

私はあなたがこの後だと思う:

SELECT image_id
FROM list
WHERE (style_id, style_value) IN ((24,'red'),(25,'big'),(27,'round'))
GROUP BY image_id
HAVING count(distinct style_id, style_value)=3

ANDを使用することはできません。同じ行で同時に値を24 red25 bigおよび27 roundにすることはできませんが、同じstyle_id, style_valueの下で複数行のimage_idの存在を確認する必要があるためです。

このクエリでは、IN(この特定の例ではORと同等)を使用しており、一致する個別の行をカウントしています。 3つの異なる行が一致する場合、そのimage_idに3つの属性すべてが存在することを意味し、クエリはそれを返します。

40
fthiella
SELECT a.image_id 
FROM list a
INNER JOIN list b
   ON a.image_id = b.image_id
   AND b.style_id = 25
   AND b.style_value = 'big'
INNER JOIN list c
   ON a.image_id = c.image_id
   AND c.style_id = 27
   AND c.style_value = 'round'
WHERE a.style_id = 24 
   AND a.style_value = 'red'
10
bobwienholt

結果が得られることはありません。単純な論理エラーです。

style_id = 24 AND style_id = 25 AND style_id = 26を持つ行を返すようにデータベースに要求しています。 24は25でも26でもないため、結果は得られません。

ORを使用する必要があります。それは意味があります。

8
akashivskyy
select unique red24.image_id from 
( 
    select image_id from `list` where style_id = 24 and style_value = 'red' 
) red24
inner join 
( 
    select image_id from `list` where style_id = 25 and style_value = 'big' 
) big25
on red24.image_id = big25.image_id
inner join 
( 
    select image_id from `list` where style_id = 27 and style_value = 'round' 
) round27
on red24.image_id = round27.image_id

このクエリを使用している場合、結果または空の結果が得られない可能性があります。以下のように、クエリでORの代わりにANDを使用する必要があります。

$query = mysql_query("SELECT image_id FROM list WHERE (style_id = 24 AND style_value = 'red') OR (style_id = 25 AND style_value = 'big') OR (style_id = 27 AND style_value = 'round');

このクエリを試してください。

1
Ajay Gupta

Style_idの数にもよりますが、実装するのは難しいでしょう(style_idが静的かどうかはわかりません)。これが当てはまる場合、WHERE句は行ごとに機能するため、必要なことは実際には不可能です。

WITH cte as (
  SELECT
    image_id,
    max(decode(style_id,24,style_value)) AS style_colour,
    max(decode(style_id,25,style_value)) AS style_size,
    max(decode(style_id,27,style_value)) AS style_shape
  FROM
    list
  GROUP BY
    image_id
)
SELECT
  image_id
FROM
  cte
WHERE
  style_colour = 'red'
  and style_size = 'big'
  and style_shape = 'round'

http://sqlfiddle.com/#!4/fa5cf/18

1
Lock