MySQL Multiple Where子句

Bug*_*SEL 25 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
Run Code Online (Sandbox Code Playgroud)

我想在以下情况下使用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')
Run Code Online (Sandbox Code Playgroud)

但我无法得到任何结果.当我用OR制作这个样本时,效果很好.但我必须用AND做到这一点.因为我需要图像id,它们都是"红色,大而直".

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

谢谢,

干得好.

fth*_*lla 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
Run Code Online (Sandbox Code Playgroud)

您不能使用AND,因为值不能24 red25 big并且27 round同时在同一行中,但您需要在同一行中检查style_id, style_value多行的存在image_id.

在这个查询中我使用IN(在这个特定的例子中,相当于一个OR),我正在计算匹配的不同行.如果3个不同的行匹配,则表示所有3个属性都存在image_id,并且我的查询将返回它.


bob*_*olt 10

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'
Run Code Online (Sandbox Code Playgroud)


aka*_*kyy 8

你永远不会得到结果,这是一个简单的逻辑错误.

你要求你的数据库返回一行style_id = 24 AND style_id = 25 AND style_id = 26.由于24不是25或26,你将得不到任何结果.

你必须使用OR,然后它是有道理的.


Loc*_*ock 4

这可能就是您所追求的,尽管取决于有多少 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'
Run Code Online (Sandbox Code Playgroud)

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