You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:26:56