MySQL选择数组中的所有元素

时间:2012-02-15 21:38:23

标签: mysql

我有这个数组:

$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,而是返回至少与数组的一个元素相关的所有项。

3 个答案:

答案 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));