我有一张这样的表:
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进行了大量搜索,但无法解决任何问题。
谢谢,
干得好。
答案 0 :(得分:40)
我认为你是在这之后:
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个属性,我的查询将返回该属性。
答案 1 :(得分:9)
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'
答案 2 :(得分:7)
你永远不会得到结果,这是一个简单的逻辑错误。
您要求数据库返回style_id = 24 AND style_id = 25 AND style_id = 26
行。由于24不是25或26,你将得不到任何结果。
你必须使用OR
,然后才有意义。
答案 3 :(得分:1)
这可能就是你所追求的,虽然取决于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'
答案 4 :(得分: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
答案 5 :(得分: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');
尝试此查询。