我的问题:
可以使用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类。
答案 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);