我有这个数组:
$results = array('1', '3', '123')
和这张表:
id | item | tag
1 1 1
2 1 3
3 1 123
4 2 1
5 3 1
6 4 3
我想执行这样的查询:
SELECT item FROM table WHERE ALL 3 TAGS OF THE ARRAY EXIST.
在示例中,我想仅返回Item = 1,因为它是唯一包含数组的所有3个标记的Item。
到目前为止,我有这个:
$query .= " SELECT item FROM #__table WHERE tag IN ('";
$query .= implode("','",$results);
$query .= "')";
但它不返回正确的Items,而是返回至少与数组的一个元素相关的所有项。
答案 0 :(得分:4)
要使IN作为AND而不是OR工作,可以使用HAVING子句确保获得与IN子句中存在的相同数量的不同值。
SELECT item
FROM YourTable
WHERE tag IN ('1', '3', '123')
GROUP BY item
HAVING COUNT(DISTINCT tag) = 3
答案 1 :(得分:3)
IN
子句基本上只是写出长or
链的捷径,例如。
... WHERE a IN (1,2,3)
与
相同... WHERE (a = 1) or (a = 2) or (a = 3)
如果要求IN
子句中的所有值都存在,则不能使用基本的IN子句。 MySQL中没有WHERE IN ALL (...)
类型构造。
您可以使用子查询来模拟它:
SELECT *
FROM yourtable
WHERE id IN (
SELECT DISTINCT id
FROM yourtable
WHERE tag IN (1,3,123)
GROUP BY id
HAVING (COUNT(tag) = 3)
);
内部查询获取存在所有三个标记值的所有ID,然后外部查询使用内部结果来获取完整记录。
答案 2 :(得分:1)
SQL:
SELECT item FROM table WHERE tag IN (1,3,123) GROUP BY item HAVING COUNT(DISTINCT tag) = 3;
PHP:
$query = sprintf('SELECT item FROM table WHERE tag IN (%s) GROUP BY item HAVING COUNT(DISTINCT tag) = %d',
implode(',', $results),
count($results));