8

据我了解,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 但使用 AND 代替 OR 来与数组进行比较的 SQL 函数。可以扩展到此的东西:

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

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

***编辑:感谢大家的帮助。我对我的问题的解释很糟糕,你仍然能够解决它,我很感激。我发现其他人更雄辩地提出了这个问题,并得到了我可以使用的答案:

MySQL 中是否有类似 IN 但使用 AND 而不是 OR 的东西?

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

4

3 回答 3

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

于 2012-09-21T14:19:18.913 回答
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 将查找所有三种产品都存在的订单。

于 2012-09-21T14:21:27.457 回答
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
于 2012-09-21T14:23:47.770 回答