このようなテーブルがあります:
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で多くの検索を行いましたが、解決策はありませんでした。
おかげで、
いい仕事をしてください。
私はあなたがこの後だと思う:
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 red
と25 big
および27 round
にすることはできませんが、同じstyle_id, style_value
の下で複数行のimage_id
の存在を確認する必要があるためです。
このクエリでは、IN(この特定の例ではORと同等)を使用しており、一致する個別の行をカウントしています。 3つの異なる行が一致する場合、そのimage_id
に3つの属性すべてが存在することを意味し、クエリはそれを返します。
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'
結果が得られることはありません。単純な論理エラーです。
style_id = 24 AND style_id = 25 AND style_id = 26
を持つ行を返すようにデータベースに要求しています。 24は25でも26でもないため、結果は得られません。
OR
を使用する必要があります。それは意味があります。
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');
このクエリを試してください。
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'