Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何在链接表中选择满足所有条件的记录?_Mysql_Sql - Fatal编程技术网

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
子句只查看两个类别,因此它适用于多个类别的产品。
不同的
可能是不必要的。仅当表可以有重复项时才需要。