MySQL Multiple Where子句

时间:2012-12-26 21:45:14

标签: mysql sql where-clause

我有一张这样的表:

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做到这一点。因为我需要图像id,它们都是“红色,大而直”。

我已经与Google进行了大量搜索,但无法解决任何问题。

谢谢,

干得好。

6 个答案:

答案 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 red25 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'

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

答案 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');

尝试此查询。