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 = 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')
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 red
和25 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)
你永远不会得到结果,这是一个简单的逻辑错误.
你要求你的数据库返回一行style_id = 24 AND style_id = 25 AND style_id = 26
.由于24不是25或26,你将得不到任何结果.
你必须使用OR
,然后它是有道理的.
这可能就是您所追求的,尽管取决于有多少 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
归档时间: |
|
查看次数: |
98401 次 |
最近记录: |