MySQL合并两查询结果及查询供应全量红绿零件供应商ID问题
搞定MySQL的两个查询需求
1. 合并两个查询的结果
如果你的两个查询返回的列结构(列数、数据类型)一致,直接用 UNION 或者 UNION ALL 就能合并结果啦:
UNION:会自动去除两个结果集中的重复行UNION ALL:保留所有行(包括重复的),性能比UNION更好
举个实际例子,假设你有两个查询:一个查供应红色零件的供应商,另一个查供应绿色零件的供应商,合并写法如下:
-- 查询1:供应红色零件的供应商 SELECT p.ID, p.nombre, p.direccion FROM proveedores p JOIN catalogo c ON p.ID = c.proveedores_ID JOIN partes pt ON c.partes_ID = pt.ID WHERE pt.color = 'rojo' UNION ALL -- 换成UNION会去重,按需选择 -- 查询2:供应绿色零件的供应商 SELECT p.ID, p.nombre, p.direccion FROM proveedores p JOIN catalogo c ON p.ID = c.proveedores_ID JOIN partes pt ON c.partes_ID = pt.ID WHERE pt.color = 'verde';
只要两个查询的列数、对应列的类型匹配,就能无缝合并。
2. 查询供应所有红色或绿色零件的供应商ID
这里的核心逻辑是:先找出所有红色+绿色零件的总数,再统计每个供应商实际供应的这类零件数量,只有数量等于总数的供应商,才是供应了所有红/绿零件的。
完整查询语句如下:
SELECT c.proveedores_ID AS 供应商ID FROM catalogo c JOIN partes pt ON c.partes_ID = pt.ID -- 筛选出红色或绿色的零件 WHERE pt.color IN ('rojo', 'verde') -- 按供应商分组 GROUP BY c.proveedores_ID -- 筛选出供应的不同零件数等于所有红/绿零件总数的供应商 HAVING COUNT(DISTINCT pt.ID) = ( -- 子查询:获取所有红色或绿色零件的总数量 SELECT COUNT(DISTINCT ID) FROM partes WHERE color IN ('rojo', 'verde') );
关键细节说明:
- 用
COUNT(DISTINCT pt.ID)是因为同一个供应商可能多次供应同一个零件(比如不同批次、不同价格),统计不同的零件ID才能准确反映供应商覆盖的零件种类。 - 如果存在某个红色/绿色零件没有任何供应商供应,那最终结果会是空集(因为没有供应商能覆盖所有零件)。
内容的提问来源于stack exchange,提问作者Felipe Rodriguez
相关产品推荐
相关产品推荐

