首页 > 解决方案 > 获取所有具有选定配件的车辆

问题描述

车辆(PK=v_id)和附件(PK=a_id)之间存在多对多的关系。有一个桥接表vehicles_accessories(PK=v_id,a_id)。

网页上的客户可以选择车辆必须具有的所需配件,并且查询应仅选择具有所有这些配件的车辆。选择的附件数量是可变的。客户可以选择 2 个配件,其他时候可以选择 4 个,等等。

我的 SQL 查询如下所示:

select * from vehicles where v_id in
(
  select v.v_id
  from vehicles v
  join vehicle_accessories va on va.v_id=v.v_id
  where va.a_id in (32,34)
  group by v.v_id
  having count(*)=2
)

在页面上,我收集客户选择的配件并将它们放在 IN 子句中,其中 HAVING COUNT(*)=# of selected Accessories。

有更好的方法吗?

标签: sql

解决方案


您的加入太多:

select v.*
from vehicles v
where v.v_id in (select va.v_id
                 from vehicle_accessories va
                 where va.a_id in (32, 34)
                 group by va.v_id
                 having count(*) = 2
                );

在某些数据库中,使用joinor可能会更快not exists,但这取决于特定的数据库。


推荐阅读