如何合并两个MySQL查询的交集结果,筛选符合要求的硬件产品制造商
原代码问题说明
你提供的代码存在两个核心语法逻辑错误:
- 没有为JOIN操作指定两个结果集的关联字段,SQL无法识别如何匹配两个子查询的结果
- 缺少外层SELECT语句定义最终返回的内容,整体SQL结构不完整
正确实现方案
方案1:单查询一步实现(推荐,逻辑更简洁性能更好)
SELECT p.Maker FROM Product p LEFT JOIN Desktop d ON p.Model = d.Model LEFT JOIN Laptop l ON p.Model = l.Model WHERE p.Type IN ('Desktop', 'Laptop') AND COALESCE(d.Ram, l.Ram) >= 512 GROUP BY p.Maker HAVING COUNT(DISTINCT p.Model) = 2;
逻辑说明:先关联三张表拿到所有台式机、笔记本的RAM参数,过滤出RAM≥512的产品后按制造商分组,筛选出刚好有2款符合要求产品的制造商,和你预期输出结果匹配。
方案2:贴合你原有拆分逻辑的修正写法
如果你需要保留你原本拆分两个独立查询再合并的思路,可以参考以下修正后的代码:
SELECT t1.Maker FROM ( -- 子查询1:筛选拥有2款台式机/笔记本的制造商 SELECT Maker FROM Product WHERE Type = 'Desktop' GROUP BY Maker HAVING COUNT(*) = 2 UNION SELECT Maker FROM Product WHERE Type = 'Laptop' GROUP BY Maker HAVING COUNT(*) = 2 ) t1 INNER JOIN ( -- 子查询2:筛选产品RAM≥512的制造商 SELECT DISTINCT p.Maker FROM Product p NATURAL JOIN Desktop d WHERE d.Ram >= 512 UNION SELECT DISTINCT p.Maker FROM Product p NATURAL JOIN Laptop l WHERE l.Ram >= 512 ) t2 ON t1.Maker = t2.Maker;
逻辑说明:将两个子查询分别作为临时表,通过制造商字段做内连接,返回同时满足两个条件的制造商。
内容的提问来源于stack exchange,提问作者Kenyon
相关产品推荐
相关产品推荐

