Mysql 如何在链接表中选择满足所有条件的记录?
鉴于这两个表格: 产品Mysql 如何在链接表中选择满足所有条件的记录?,mysql,sql,Mysql,Sql,鉴于这两个表格: 产品 product_id name 1 shampoo 2 hairbrush id product_id category_id 0 1 100 1 1 200 2 2 100
product_id name
1 shampoo
2 hairbrush
id product_id category_id
0 1 100
1 1 200
2 2 100
从产品到类别的产品
product_id name
1 shampoo
2 hairbrush
id product_id category_id
0 1 100
1 1 200
2 2 100
我想编写SQL,它将为我提供100类和200类中的所有产品(即id为1的产品)
(我们可以假设categories表的存在。products_to_categories是一个链接表)
显然不起作用,因为没有行同时具有这两个值
我考虑过运行两个select,然后运行一个只在两个集合中查找product_id的操作,但并集是附加的,而不是减法的
这是工作,但不是重量轻
select products.* from products where products.product_id IN (
select p.product_id from products as p
inner join products_to_categories as pc ON pc.product_id = p.product_id AND pc.category_id = 100
)
AND
products.product_id IN (
select p.product_id from products as p
inner join products_to_categories as pc ON pc.product_id = p.product_id AND pc.category_id = 200
) ;
一定有更好的方法吗
谢谢您可以使用
分组方式
和拥有
:
select p.*
from products p inner join
products_to_categories pc
on p.product_id = pc.product_id
where pc.category_id in (100, 200);
group by p.product_id
having count(distinct category_id) = 2;
注意:这使用了ANSI SQL特性,允许您按表的主键分组并引用其余列。并非所有数据库都支持此功能。因此,在许多数据库中,您需要在
分组中按
单独列出产品字段用您正在使用的数据库标记您的问题。非常好。多谢各位。你能解释一下distinct在这里做什么吗?我的例子没有它也行。您是否允许给定产品在products_to_categories表中有两个条目具有相同的category_id?但可能存在问题。这只是告诉我产品_id 1分为两类?在我的实际案例中,有两个以上的类别,一个产品可以分为两个类别,但不是正确的两个。(从我的问题上看,这并不明显,我很感激)@JustinWyllie。WHERE
子句只查看两个类别,因此它适用于多个类别的产品。不同的
可能是不必要的。仅当表可以有重复项时才需要。