27

我有一张这样的桌子:

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。

我用谷歌做了很多搜索,但没有找到任何解决方案。

4

6 回答 6

46

我认为您在此之后:

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 redand 25 big,但您需要检查多行中的存在,在相同的.27 roundstyle_id, style_valueimage_id

在此查询中,我使用 IN(在此特定示例中,它等效于 OR),并且我正在计算匹配的不同行。如果 3 个不同的行匹配,这意味着所有 3 个属性都存在image_id,我的查询将返回它。

于 2012-12-26T22:52:18.400 回答
13
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'
于 2012-12-26T23:48:37.580 回答
9

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

您要求您的数据库返回具有style_id = 24 AND style_id = 25 AND style_id = 26. 由于 24 既不是 25 也不是 26,所以你不会得到任何结果。

您必须使用OR,然后它才有意义。

于 2012-12-26T22:41:18.553 回答
2

这可能是您所追求的,尽管取决于有多少 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

于 2012-12-26T22:40:32.067 回答
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
于 2012-12-27T01:23:44.127 回答
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');

试试这个查询。

于 2015-10-16T07:01:52.913 回答