【问题标题】:SUM a field from other table with Left Join on MySQL and PHP在 MySQL 和 PHP 上使用 Left Join 对其他表中的字段求和
【发布时间】:2015-04-15 20:13:36
【问题描述】:

我有四个表:Table_A、Table_B、Table_C 和 Table_D。

TABLE_A
id_a | Name
A1   | ASD
A2   | ZXC

TABLE_B
id_b | id_a
B1   | A1
B2   | A2

TABLE_C
id_c | id_b | Value
C1   | B1   | 1
C2   | B1   | 1
C3   | B2   | 1
C4   | B2   | 1
C5   | B2   | 1

TABLE_D
id_d | id_a | Bill
D1   | A1   | 5
D2   | A2   | 10

我想为每个 table_a.id_a 获取 SUM(table_c.value) 作为 tot1 和 SUM(table_d.bill) 作为 tot2,如下所示:

id_a  | SUM_VALUE of table_c | SUM_BILL of table_d
A1    | 2                    | 5
A2    | 3                    | 10

我正在使用这个脚本:

$sql=" SELECT *, SUM(table_c.value) as tot1, SUM(table_d.bill) as tot2
FROM table_a
LEFT JOIN table_b ON table_b.id_a=table_a.id_a
LEFT JOIN table_c ON table_c.id_b=table_b.id_b
GROUP BY id_a ";

但是得到了错误的结果:

id_a  | SUM_VALUE of table_c | SUM_BILL of table_d
A1    | 2                    | 10
A2    | 3                    | 30

有什么想法吗?

【问题讨论】:

    标签: php mysql sql join sum


    【解决方案1】:

    我得到了解决方案:)

    SELECT *,
           Sum(bill) AS sum_of_tableD
    FROM   table_d,
           table_a
           LEFT JOIN (SELECT *,
                             Sum(table_c.value) AS sum_of_tableC
                      FROM   table_c,
                             table_b
                      WHERE  table_c.id_b = table_b.id_b
                      GROUP  BY id_b) x
                  ON x.id_a = USER.id_a
    WHERE  table_d.id_a = table_a.id_a 
    

    【讨论】:

      【解决方案2】:

      首先找到SUM_VALUE_of_table_c 然后Left joinTableD 的结果找到SUM_BILL_of_table_d 这将避免在TableD 中求和重复值。试试这个。

      SELECT F.id_a,
             F.SUM_VALUE_of_table_c,
             Sum(d.Bill) AS SUM_BILL_of_table_d
      FROM   (SELECT a.id_a,
                     Sum(c.Value) AS SUM_VALUE_of_table_c
              FROM   table_a A
                     LEFT JOIN table_b B
                            ON B.id_a = A.id_a
                     LEFT JOIN table_c C
                            ON c.id_b = B.id_b
              GROUP  BY a.id_a) F
             LEFT JOIN TABLE_D D
                    ON d.id_a = F.id_a 
      Group by F.id_a 
      

      SQLFIDDLE DEMO

      【讨论】:

      • 这行不通。 SUM_BILL_of_table_b 的值是重复的 :(
      • @FedriAndhika - 更新,错过了group by。也添加了演示
      • 感谢大师的关注:)
      【解决方案3】:

      您可以在加入前进行总和计算:

      SELECT a.id_a, b.sum_b, c.sum_c
      FROM   table_a a
      JOIN   table_b b ON a.id_a = b.id_b
      JOIN   (SELECT   id_b, SUM(value)
              FROM     table_c
              GROUP BY id_a) c ON b.id_b = c.id_b
      JOIN   (SELECT   id_a, SUM(value)
              FROM     table_d
              GROUP BY id_a) c ON a.id_a = d.id_b       
      

      【讨论】:

        猜你喜欢
        • 2013-07-02
        • 1970-01-01
        • 1970-01-01
        • 2013-04-05
        • 2016-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-05
        相关资源
        最近更新 更多