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

如何用单条MySQL语句关联两张表统计各公司名称对应的订单总数

问题原因

你原有SQL的核心问题是:隐式内连接会让同一公司下的多条Persons人员记录,重复匹配到同一条Orders订单记录,产生大量重复行,最终统计出来的订单数会远高于实际值。
比如某公司有6名员工、10条订单,关联后会生成60行关联数据,count(o.oid)得到的结果是60而非正确的10。

修正后的查询语句

方案1:直接对订单ID去重统计(写法简单,适合中小数据量)

SELECT 
    p.companyName AS `Name`,
    COUNT(DISTINCT o.oid) AS `Total`
FROM Orders o
INNER JOIN Persons p 
    ON o.companyID = p.companyID
GROUP BY p.companyName
ORDER BY `Total` DESC;

这里加DISTINCT对订单ID去重,避免重复计数,同时将字段别名调整为你需要的Name和Total,用显式JOIN替代原有隐式连接,逻辑更清晰。

方案2:先对公司映射去重再关联(性能更优,适合大数据量场景)

先从Persons表提取唯一的公司ID和公司名称映射,再关联订单表统计,避免不必要的重复匹配:

SELECT 
    p_unique.companyName AS `Name`,
    COUNT(o.oid) AS `Total`
FROM Orders o
INNER JOIN (
    SELECT DISTINCT companyID, companyName FROM Persons
) p_unique 
    ON o.companyID = p_unique.companyID
GROUP BY p_unique.companyName
ORDER BY `Total` DESC;

扩展:需要统计无订单的公司(订单数显示为0)

将内连接改为左连接,同时用IFNULL处理空值即可:

SELECT 
    p_unique.companyName AS `Name`,
    IFNULL(COUNT(o.oid), 0) AS `Total`
FROM (
    SELECT DISTINCT companyID, companyName FROM Persons
) p_unique
LEFT JOIN Orders o 
    ON o.companyID = p_unique.companyID
GROUP BY p_unique.companyName
ORDER BY `Total` DESC;

内容的提问来源于stack exchange,提问作者P.Coder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 08:57:02