如何用单条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
相关产品推荐
相关产品推荐

