繁体   English   中英

如何在链接表中选择满足所有条件的记录?

[英]How to select records which meet all criteria in linking table?

给定这两个表:

制品

product_id         name
1                  shampoo
2                  hairbrush

products_to_categories

id                 product_id    category_id
0                  1             100
1                  1             200
2                  2             100

我想编写一个SQL,它将为我提供类别100和类别200中的所有产品(即ID为1的产品)。

(我们可以假设存在类别表。products_to_categories是一个链接表)。

select p.*, pc.* from products as p
inner join products_to_categories as pc
where pc.category_id = 100 and pc.category_id = 200;

显然不起作用,因为没有行同时具有这两个值。

我考虑过先运行两个选择,然后再运行只能在两个集合中都找到product_id的操作-但是UNION是附加的,而不是减法的。

这可行,但不轻巧;

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 

)    ;

一定有更好的方法可以做到这一点?

谢谢

您可以使用group byhaving

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功能,该功能允许您按表的主键进行分组,并引用其余的列。 并非所有数据库都支持此功能。 因此,在许多数据库中,您需要在group by单独列出产品字段。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM