mysql - 在 WHERE IN() 子句中选择语句
问题描述
鉴于这些表:
Product(maker, model)
Desktop(model)
Laptop(model)
我想知道同时生产笔记本电脑和台式机的制造商。
如果我想知道制造商是否生产两种特定型号,我会这样做:
SELECT p.maker FROM Product p
WHERE p.model IN ('model1', 'model2')
GROUP BY p.maker
HAVING COUNT(DISTINCT p.model) = 2;
在这种情况下,我不需要特定型号,但我需要知道一种型号必须是笔记本电脑,另一种型号必须是台式机。
我应该像这样在 IN 子句中使用 select 语句吗?
SELECT p.maker FROM Product p
WHERE p.model IN ((SELECT d.model FROM Desktop d WHERE d.model=p.model),
(SELECT l.model FROM Laptop d WHERE l.model=p.model))
GROUP BY p.maker
HAVING COUNT(DISTINCT p.model) = 2;
或者还有其他更好的方法吗?
编辑:正如 HoneyBadger 所建议的,使用 EXISTS 是一种更好的方法:
SELECT p.maker FROM Product p
WHERE EXISTS(SELECT d.model FROM Desktop d WHERE d.model=p.model)
AND EXISTS(SELECT l.model FROM Laptop d WHERE l.model=p.model)
GROUP BY p.maker
HAVING COUNT(DISTINCT p.model)>1;
解决方案
SELECT p.maker FROM Product p
WHERE p.model IN (
(SELECT d.model FROM Desktop d WHERE d.model=p.model
UNION
SELECT l.model FROM Laptop d WHERE l.model=p.model
)
)
GROUP BY p.maker
HAVING COUNT(DISTINCT p.model) = 2;
我还希望将这些重构到同一个表中,并使用一个可以指定台式机与笔记本电脑的类型字段。我了解笔记本电脑可能有一些不同的属性(屏幕、摄像头/麦克风、蓝牙等)
推荐阅读
- asp.net-core - 使用标识框架在 Windows 服务中托管 ASP.NET Core
- php - mysqli_query 期望参数 1 是 mysqli AND mysqli_fetch_all 问题
- c - 结果不一致和 pthread 混淆
- r - 匹配“foo”的实例,后面没有“bar”
- c# - 根据文本框输入生成数据网格行
- css - javafx tableview - 突出显示 setCellSelectionEnabled(true) 上的行
- reactjs - 如何禁用默认 BackHandler 而不会在单个场景中覆盖它?
- nativescript - 用于缓存的 Nativescript 插件
- php - 如何在运行时更改应用环境?
- sonarqube - 声纳扫描仪 - 维护“损坏”文件列表以跳过