27

次のようなテーブルがあります。

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 = 24style_value = red
  • style_id = 25style_value = big
  • style_id = 26style_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 で行う必要があります。「red、big、rect」の両方である image id が必要だからです。

私はGoogleで多くの検索を行いましたが、解決策を見つけることができませんでした.

4

6 に答える 6

46

私はあなたがこの後だと思います:

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 roundstyle_id, style_valueimage_id

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

于 2012-12-26T22:52:18.400 に答える
13
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'
于 2012-12-26T23:48:37.580 に答える
9

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

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

を使用する必要がありますOR。そうすれば、それは理にかなっています。

于 2012-12-26T22:41:18.553 に答える
2

これはあなたが求めているものかもしれませんが、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

于 2012-12-26T22:40:32.067 に答える
1

このクエリを使用すると、結果が得られないか、空の結果が得られる可能性があります。以下のようにクエリ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');

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

于 2015-10-16T07:01:52.913 に答える
1
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
于 2012-12-27T01:23:44.127 に答える