【问题标题】:Left join Count disturbing left join SUM左连接计数干扰左连接总和
【发布时间】:2019-05-19 07:15:16
【问题描述】:

当我添加一个左连接来获取外部表的计数时,它将我的其他左连接表的总和值乘以计数,我也不能在这里使用不同的总和,因为两个值可以相同:

SELECT c.id as company_id, SUM(ct.amount) as total_billed, count(l.id) as load_count
FROM tbl_companies c
LEFT JOIN tbl_company_transactions ct ON c.id = ct.company_id
LEFT JOIN tbl_loads l ON c.id = l.company_id
GROUP BY c.id;

【问题讨论】:

  • 请提供示例数据和所需的输出。
  • @Tony 它就像主表一样简单是公司,一个公司可以有多个负载和多个事务,我想要每个公司的所有事务的总和以及每个公司的所有负载的计数

标签: mysql sql


【解决方案1】:

您需要预先聚合数据:

SELECT c.id as company_id, ct.total_billed,  
       l.load_count
FROM tbl_companies c LEFT JOIN
     (SELECT ct.company_id, SUM(ct.amount) as total_billed
      FROM tbl_company_transactions ct
      GROUP BY ct.company_id
     ) ct
     ON c.id = ct.company_id LEFT JOIN
     (SELECT l.company_id, COUNT(*) as load_count
      FROM tbl_loads l
      GROUP BY l.company_id
     ) l
     ON c.id = l.company_id;

正如您所观察到的,JOIN 会增加行数并影响聚合。

【讨论】:

    【解决方案2】:

    您可以隔离汇总统计数据并在之后加入结果。

    WITH 
    tranStats AS (
        SELECT company_id, SUM(amount) AS total_billed
        FROM tbl_company_transactions
        GROUP BY company_id
    ),
    loadStats AS (
        SELECT company_id, COUNT(1) AS load_count
        FROM tbl_loads
        GROUP BY company_id
    )
    SELECT id, total_billed, load_count
    FROM tbl_companies c
    LEFT JOIN tranStats t ON t.company_id = c.id
    LEFT JOIN loadStats l ON l.company_id = c.id
    

    【讨论】:

    • 这是一个正确答案,但取决于 OP 使用的 MySQL 版本。
    【解决方案3】:

    Gordon 的答案更具可扩展性,但对于这个特定查询,您只需要一个子查询 — 这也可能会提高性能,因为预聚合数据上的连接可能无法使用索引。

    SELECT c.id as company_id, SUM(ct.amount) as total_billed, l.load_count
    FROM tbl_companies c
        LEFT JOIN tbl_company_transactions ct ON c.id = ct.company_id
        LEFT JOIN (
            SELECT company_id, count(*) as load_count
            FROM tbl_loads
            GROUP BY company_id
        ) l ON c.id = l.company_id
    GROUP BY c.id;
    

    要掌握的重要一点是,如果您需要像 SUM()COUNT() 这样的聚合函数的结果,则在对多行执行多个连接时需要小心。

    【讨论】:

      猜你喜欢
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      • 2014-08-08
      • 2015-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多