给定两个表以及与这两个表相关的第三个表,请仅从表A中选择与表B行的列表匹配但与另一个列表不匹配的行

问题描述

我的测试架构,数据和查询https://www.db-fiddle.com/f/apQXP7MGfDKPHVw6ucmuNv/1

我的查询应仅选择与所有IN()零件特征匹配的汽车,而没有与NOT IN()匹配的汽车,并且只应选择每个匹配的汽车一次。

在示例数据中,当我运行查询时,我希望看到包含两列的一行,其中包含与where子句的IN()部分中的功能列表匹配的唯一汽车的ID和名称与where子句的NOT IN()部分中的功能列表不匹配:

1 | camry

相反,每次汽车与where子句的IN()部分中的值之一匹配时,我都会得到包含汽车名称的行:

1 | camry    | 2 | 1 | 2 | 2 | backup camera
1 | camry    | 3 | 1 | 3 | 3 | sun roof
2 | forester | 4 | 2 | 2 | 2 | backup camera
2 | forester | 5 | 2 | 3 | 3 | sun roof

解决方法

如果您要每辆汽车排一行,则需要汇总。我认为您想要的是:

SELECT c.id,c.name
FROM `car` c JOIN
     `bridge_car_features` cf  
      ON car.id = bridge.car_id JOIn
      `features` f  
      ON cf.features_id = f.id 
GROUP BY c.id
HAVING SUM(f.name IN ('backup camera','sun roof')) > 0 AND  -- has at least one of these
       SUM(f.name IN ('four wheel drive')) = 0;              -- has none of these

这里是fiddle

注意:为了使小提琴奏效,我将id设为cars上的主键。