同一列中的MYSQL AND运算符比较

时间:2012-12-03 13:15:33

标签: mysql sql

我正在尝试执行此查询,任何人都可以帮助它为什么不起作用。

SELECT DISTINCT (p.fld_tag_id) 
FROM tbl_tag_properties as p 
WHERE 3 = (SELECT count(c.fld_tag_id) 
FROM tbl_tag_properties as c 
WHERE c.fld_tag_category_value_id in (67, 20, 48) 
and c.fld_tag_id = p.fld_tag_id) 
AND p.fld_tag_category_value_id IN (55, 56) 
AND p.fld_tag_category_value_id IN (74, 75)

while ....

此查询在最后使用单个AND运算符正确执行,但我需要多个AND运算符。

SELECT DISTINCT (p.fld_tag_id) 
FROM tbl_tag_properties as p 
WHERE 3 = (SELECT count(c.fld_tag_id) 
FROM tbl_tag_properties as c 
WHERE c.fld_tag_category_value_id in (67, 20, 48) 
and c.fld_tag_id = p.fld_tag_id) 
AND p.fld_tag_category_value_id IN (55, 56) 

3 个答案:

答案 0 :(得分:4)

如何将ID限制在一个范围内,然后再尝试将其限制为另一个范围? ;) 这就像我想要着色为黑色and白色。除非您希望颜色为in(黑色,白色),否则不可能。另一种方式color = BLACK or color = WHITE ....我只是举了颜色的例子以便于解释。

首先尝试这个问题:

AND p.fld_tag_category_value_id IN (55, 56, 74, 75)

你正在这里进行自我加入,但WHERE 3 =对此有何看法?如果您可以简单地告诉您对表格架构的期望输出,那会更好。

如果要限制为3返回的记录,请使用LIMIT。请查看以下示例,并告诉我们确实需要什么。 :)很高兴了解并帮助你。

* SQLFIDDLE

答案 1 :(得分:2)

您的两条AND行互相排斥:

AND p.fld_tag_category_value_id IN (55, 56) 
AND p.fld_tag_category_value_id IN (74, 75)

您的价值不能同时位于55, 5674, 75

尝试:

SELECT DISTINCT (p.fld_tag_id) 
FROM tbl_tag_properties as p 
WHERE 3 = (SELECT count(c.fld_tag_id) 
FROM tbl_tag_properties as c 
WHERE c.fld_tag_category_value_id in (67, 20, 48) 
AND c.fld_tag_id = p.fld_tag_id) 
AND p.fld_tag_category_value_id IN (55, 56, 74, 75)

使用OR运算符:

SELECT DISTINCT (p.fld_tag_id) 
FROM tbl_tag_properties as p 
WHERE 3 = (SELECT count(c.fld_tag_id) 
FROM tbl_tag_properties as c 
WHERE c.fld_tag_category_value_id in (67, 20, 48) 
AND c.fld_tag_id = p.fld_tag_id) 
AND (p.fld_tag_category_value_id IN (55, 56)
    OR p.fld_tag_category_value_id IN (74, 75))

这样您就可以按照自己的方式构建查询。不要忘记括号。

答案 2 :(得分:1)

你的最后一个AND应该包含所有可能的值。 为了解释它失败的原因,假设为p.fld_tag_category_value_id = 55。 然后在您的查询中首先AND即

AND p.fld_tag_category_value_id IN (55, 56) // Will evaluate to TRUE

将为true,但第二个AND条件为FALSE,因为单个值不能同时满足您的AND条件。

AND p.fld_tag_category_value_id IN (74, 75) // Will evaluate to FALSE

如果您尝试以下操作,它将起作用。

....
AND p.fld_tag_category_value_id IN (55, 56, 74, 75)