我正在尝试从关联表中选择满足同一字段的两个或更多值的项目,听起来令人困惑,让我解释一下。
+-----------------------+
| item_id | category_id |
+-----------------------+
| 1 | 200 |
| 1 | 201 |
| 1 | 202 |
| 2 | 201 |
| 2 | 202 |
| 3 | 202 |
| 3 | 203 |
| 4 | 201 |
| 4 | 207 |
+-----------------------+
在表格中,我希望只能选择我传递的类别中的项目。因此,例如,如果我传递201和202的类别ID,我只想要两个类别的项目(它们可以有其他类别,但至少需要在我查询的类别中),所以在这种情况下,我只想要第1项和第2项,因为它们是201和202类别中唯一的项目。
我的初始SQL语句类似于
SELECT * FROM item_category WHERE category_id = 201 AND category_id = 202;
但显然这不起作用。
SELECT * FROM item_category WHERE category_id = 201 OR category_id = 202;
上述查询也不起作用,因为它也会返回第4项和第3项。
那么我如何才能选择至少必须属于两个类别的项目呢?
请记住,我可能会传递超过2个类别ID。
感谢您的帮助。
答案 0 :(得分:8)
WHERE子句中的表达式对联接结果集的单行起作用。这就是为什么WHERE category_id = 201 AND category_id = 202
不起作用的原因 - 因为它不能是单行上的两个值。
因此,您需要某种方法将表中的两行连接到结果集的一行。您可以使用自我加入:
执行此操作SELECT c1.item_id
FROM item_category AS c1
INNER JOIN item_category AS c2 ON c1.item_id = c2.item_id
WHERE c1.category_id = 201 AND c2.category_id = 202
当您要搜索三个,四个,五个或更多值时,此技术难以扩展,因为它需要 N-1 连接以匹配 N 值
另一种方法是使用GROUP BY:
SELECT c.item_id, COUNT(*) AS cat_count
FROM item_category AS c
WHERE c.category_id IN (201,202)
GROUP BY c.item_id
HAVING cat_count = 2
这两种技术都没问题,在不同情况下效果更好。
答案 1 :(得分:0)
使用JOIN或GROUP BY:
SELECT category_id, fieldhere, anotherfield
FROM item_category
WHERE category_id in (201,202)
GROUP BY category_id
HAVING count(category_id) = 2
答案 2 :(得分:0)
假设每个item_id,category_id都是唯一的,
select *, count(item_id) as c from item_category
where category_id in (201, 202)
group by item_id
having c = 2;
用c =(类别数)替换c = 2
答案 3 :(得分:0)
我现在没有时间提供确切的查询,但尝试这样的事情:
select item_category.* from
item_category , item_category ic1, item_category ic2 where
ic1.category_id = 201 and
ic2.category_id = 202 and
ic1.item_id = ic2.item_id and
item_category.item_id = ic1.item_id and
item_category.item_id = ic2.item_id;
也许条件错了,但你可以这样尝试。
答案 4 :(得分:-2)
你可以尝试:
SELECT * FROM item_category WHERE category_id IN (201, 202, ...)
(或者,正如评论所说......你可能不会。)