给定两个 table 和第三个 table 与两者相关,select 只有 table A 中的行与 table B 行的列表相匹配,但是不要'匹配另一个列表

given two tables and a third table relating the two, select only the rows from table A that match a list of table B rows, but don't match another list

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

我的查询应该 select 只有匹配所有 IN () 部分特征的汽车,和 NONE 的 NOT IN (),并且它应该只 select 每个配车一次

在我的示例数据中,当我 运行 查询时,我希望看到包含两列的单行,其中包含与 IN ( ) 部分 where 子句不匹配 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

如果您希望每 car 一行,则需要聚合。我想你想要的是:

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.

注意:为了使 fiddle 起作用,我将 id 设为 cars 上的主键。