MySQL Select ID 出现在具有多个特定值的列的不同行上
Posted
技术标签:
【中文标题】MySQL Select ID 出现在具有多个特定值的列的不同行上【英文标题】:MySQL Select ID's which occur on different rows with multiple specific values for a column 【发布时间】:2011-09-13 18:57:28 【问题描述】:我正在尝试从关联表中选择满足同一字段的两个或多个值的项目,听起来很混乱,让我解释一下。
+-----------------------+
| 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。
感谢您的帮助。
【问题讨论】:
【参考方案1】:您在 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
这两种技术都可以,并且在不同的情况下效果更好。
【讨论】:
谢谢,第二个查询似乎更适合这种情况,而且工作正常!再次感谢!【参考方案2】:使用 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
【讨论】:
【参考方案3】:假设每个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 = 2 替换为 c =(类别计数)
【讨论】:
【参考方案4】:我现在没有时间提供确切的查询,但试试这样的:
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;
可能条件不对,但您可以尝试这种方式。
【讨论】:
我不确定是否真的需要 ic1.item_id = ic2.item_id。【参考方案5】:你可以试试:
SELECT * FROM item_category WHERE category_id IN (201, 202, ...)
(或者,正如 cmets 所说......你可能不会。)
【讨论】:
这将返回 item_ids 3 和 4以上是关于MySQL Select ID 出现在具有多个特定值的列的不同行上的主要内容,如果未能解决你的问题,请参考以下文章