可以使用Mysql IN()函数匹配其所有值而不是ANY吗?

时间:2014-10-24 11:31:57

标签: php mysql

我的问题:
可以使用Mysql IN()函数匹配传递给它的所有值而不是ANY吗?如果不能,是否有其他功能可以这样做?

查看我遇到的一个示例:

$catIds = implode(',' array(8, 15));
$q = "SELECT account_id 
      FROM category_records
      WHERE user_id = '5'
      AND category_id IN ($catIds) ";
$r = mysqli_query($mysqli, $q);

表架构:

id  |  user_id  |  category_id  |  account_id
1   |  5        |  8            |  150
2   |  5        |  12           |  150
3   |  5        |  15           |  150
4   |  5        |  8            |  153
5   |  5        |  15           |  153
6   |  5        |  12           |  160
7   |  5        |  3            |  160
8   |  5        |  15           |  165
9   |  5        |  8            |  165

$catArray = ('8', '15');

在上面的行帐户#150&应返回#165,因为它们都属于第8类和第15类。

1 个答案:

答案 0 :(得分:1)

列实际上是否可以匹配所有值?

如果我理解正确,您有一个类似于以下内容的表:

| id  | use_id  | category_id  |
|-----|---------|--------------|
| 1   |    1    |      3       |
| 2   |    5    |      1       |
| 3   |    12   |      4       |
| 4   |    9    |      4       |
| 5   |    15   |      1       |

因此,每行只能等于数组中的一个项目。如果是这种情况,则IN就是您的答案。因此,描述使用AND操作数的答案在这里不起作用,因为一个category_id无法与3或4个ID匹配。

如果'category_id'列每行包含多个Ids(这不是很好的设计),答案可能会有所不同。

- 编辑 -

鉴于表格信息,我想我明白你需要什么。您需要选择category_id为8和15并且具有相同account_id的行。在这种情况下,请使用以下查询尝试代码:

$catIds = implode(',' $catArray);
$q =      "SELECT cr.* FROM category_records cr " 
        . "INNER JOIN ( "
        . "SELECT account_id FROM category_records "
        . "     WHERE category_id in (". catIds . ") "
        . "     GROUP BY account_id HAVING count(account_id ) > 1 "
        . " ) dup "
        . "ON   cr.account_id = dup.account_id "
        . "WHERE"
        . " cr.category_id in (". catIds . ") "
        . "AND"
        . " cr.user_id = ". $this->user_id;
$r = mysqli_query($mysqli, $q);