【问题标题】:mysql count rows from two tables in one query?mysql 在一个查询中计算两个表中的行数?
【发布时间】:2021-11-07 21:41:34
【问题描述】:

我有两个 MySQL 表: Persons (pid,name,companyID,companyName) Orders (oid,companyID,details)

现在我想计算每个 companyName 的 order_id 数量如下:

Name         Total
-------------------
CompanyName1 : 1200

CompanyName2 : 758

CompanyName3 : 11

我使用了这个查询,但它不能正常工作。

SELECT count(o.oid) as total,p.companyName
    FROM orders as o, persons as p 
    WHERE o.companyID = p.companyID 
    GROUP BY p.companyName

【问题讨论】:

  • 什么不完全有效?
  • 为什么要使用名为 companyid 的列将名为 orders 的表连接到名为 persons 的表?您的查询有问题。您应该提供示例数据、期望的结果,并学习使用正确、明确、标准、可读的JOIN 语法。

标签: mysql sql count


【解决方案1】:

使用join 并将结果按p.companyID 分组

 SELECT p.companyName, count(o.oid) as total
    FROM orders as o join persons as p
    on o.companyID = p.companyID
    GROUP BY p.companyID

【讨论】:

  • 谢谢@Bharat,但我尝试了返回错误数据的代码查询,似乎缺少一些东西
  • @P.Coder 你能分享一下你得到的结果吗?
  • 您的查询不会返回与 OP 不同的结果。此外,如果您按 CompanyID 分组,但选择仅在特定设置处于活动状态并且也是不好的做法时才在 MySQL 中工作的 companyName。
  • @juergen d 能否分享一下 GOOD practice 查询?
  • 感谢@juergend 的信息/更正。您能否分享修改后的查询?
【解决方案2】:

如果您缺少没有任何订单的公司,您可以使用left join

SELECT p.companyName, count(*) as total
FROM persons p 
LEFT JOIN orders o ON o.companyID = p.companyID
GROUP BY p.companyID, p.companyName

请不要再使用旧的、遗留的连接语法 - 自 1992 年以来它已经过时了。

【讨论】:

  • @p.coder:你没有公司表吗?
  • 没有公司表。
  • 查询未按要求按公司名称分组。您可能会在justpaste.it/3qn46 看到结果截图(PS:? 是公司名称示例)
  • 那你的数据有问题。但由于我看不到完整的示例数据,我无法再为您提供帮助。
  • 感谢您的帮助,我认为错误的结果正在发生,因为这两个表的 p.companyID 值重复
【解决方案3】:

您的数据模型看起来一团糟。您在 person 表中有公司 ID 和名称但没有对应的 companies 表是高度可疑的。

在任何情况下,大概每个公司可以有多个行。你可以把persons表压缩一下,然后join

SELECT c.companyName, COUNT(*) as total
FROM orders o JOIN
     (SELECT DISTINCT companyId, companyName
      FROM persons p 
     ) c
     ON o.companyID = c.companyID 
GROUP BY c.companyName;

但是,您应该修复数据模型,以便拥有一个真正的真正公司表——尤其是因为您似乎关心该实体。

【讨论】:

    猜你喜欢
    • 2015-06-04
    • 2017-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2019-07-08
    • 2021-01-01
    • 1970-01-01
    相关资源
    最近更新 更多