问题描述
我的测试架构,数据和查询: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
上的主键。