替代“IN”,其工作方式类似于“AND”而不是“OR”

时间:2012-09-21 14:16:51

标签: mysql sql

根据我的理解,IN的工作原理如下:

$arrayName = array(1, 2, 3);

SELECT * 
FROM tableName 
WHERE productID IN ($arrayName)

相当于:

SELECT * 
FROM tableName 
WHERE productID = 1 OR productID = 2 OR productID = 3

我想知道是否有一个像IN一样工作的SQL函数,但使用AND代替OR来比较数组。可以扩展到此的东西:

SELECT * 
FROM tableName 
WHERE productID = 1 AND productID = 2 AND productID = 3

不是说它是必要的,但是对于上下文我只是为通过jQuery在PHP页面上填充的一些搜索结果创建排序列表。我可以用PHP做我需要的东西,我只是根据用户选择的选项动态创建查询,但如果可能的话我宁愿使用智能SQL函数。

***编辑:谢谢大家的帮助。我解释我的问题非常糟糕,你仍然可以解决它,我很欣赏。我发现其他人更有说服力地提出了这个问题并得到了我可以使用的答案:

Is there something in MySQL like IN but which uses AND instead of OR?

我正在试图弄清楚如何接受答案并关闭它,但我遇到了一些麻烦......

3 个答案:

答案 0 :(得分:3)

你不可能这样做,

SELECT * 
FROM tableName 
WHERE productID = 1 AND productID = 2 AND productID = 3

条件将始终返回false,因为一行的列只能有一个值,另一种方法是将结果分组,例如

SELECT colName
FROM tableName
WHERE productID IN (1,2,3)
GROUP BY colName
HAVING COUNT(DISTINCT colName) = 3

通过条件HAVING COUNT(DISTINCT colName) = 3,这意味着记录的实例必须等于IN子句上提供的参数总数。

答案 1 :(得分:3)

如上所述,您的查询将不会产生任何行。连续的productID不可能同时等于1和2。

您可能正在寻找包含这三种产品的行。假设您要查找包含所有三种产品的订单。你可以使用类似的东西:

select orderid
from orderlines ol
group by orderid
havnig max(case when ol.productid = 1 then 1 else 0 end) > 0 and
       max(case when ol.productid = 2 then 1 else 0 end) > 0 and
       max(case when ol.productid = 3 then 1 else 0 end) > 0

带有HAVING子句的GROUP BY将查找所有三种产品都存在的订单。

答案 2 :(得分:2)

SELECT orderid 
FROM tableName  
WHERE productID IN (1, 2, 3)
GROUP BY orderid
HAVING COUNT(DISTINCT productID) = 3 --this number must match the number of unique IDs in the IN clause