【问题标题】:Join MySql Tables and SUM加入 MySql 表和 SUM
【发布时间】:2015-02-08 11:10:15
【问题描述】:

我正在尝试使用 3 个表编写 JOIN 查询。我需要查询来返回每个用户基于传递给查询的链接值的总和。在我尝试的表结构、所需结果和查询下方添加。

表 1:用户详细信息


|   ID    | Name    | Link    |   
|   1     | User A  |    12   |
|   2     | User B  |    12   |
|   3     | User C  |    12   |

表 2:保存


|CreatedBy| Amount  |
|   3     | 100     | 
|   3     | 50      | 
|   2     | 75      | 

表 3:费用


|CreatedBy| Amount  |
|   2     | 20      | 
|   1     | 15      | 
|   3     | 85      | 

通过将链接值传递给查询必须返回每个用户的总计(储蓄+费用)。

结果 1:如果传递链接值 12。

查询结果为


|User Name| Total   |
|User A   | 15      | 
|User C   | 235     | 

结果 2:如果传递链接值 11。

查询结果为


|User Name| Total   |
|User B   | 95      | 

下面的查询没有返回任何结果。

SELECT 
    t1.name, 
    SUM(t2.total_amount+t3.total_amount) 
FROM 
    userdetails t1 
        LEFT JOIN savings t2 
            ON t2.created_by=t1.id 
        LEFT JOIN expense t3 
            ON t3.created_by=t1.id 
WHERE 
    t1.link=12 
    AND t1.status=1 
    AND t2.status=2 
    AND t3.status=2 
GROUP BY 
    t2.created_by,
    t3.created_by

【问题讨论】:

  • 不应该是节省减去费用吗?不只是添加它们?
  • 我只需要两者的总和(储蓄+费用)=总计
  • 链接中没有“11”
  • t2.total_amount + t3.total_amount 。您的储蓄和支出表中没有 total_amount 字段
  • @Shantanu 感谢您的帮助

标签: php mysql sql join union


【解决方案1】:

当您进行外连接时,您不能在where 子句中放置条件,否则它会使外连接无效并将其变为正常的内连接。但是,您可以通过将条件添加到连接中来获得所需的内容(基于您的 where 子句),如下所示:

SELECT 
    t1.name, 
    SUM(t2.total_amount+t3.total_amount) 
FROM 
    userdetails t1 
        LEFT JOIN savings t2 
            ON t2.created_by=t1.id 
            AND t2.status=2 
        LEFT JOIN expense t3 
            ON t3.created_by=t1.id 
            AND t3.status=2 
WHERE 
    t1.link=12 
    AND t1.status=1 
GROUP BY 
    t2.created_by,
    t3.created_by

您通常也不希望按未在 select 子句中命名的字段进行分组:

SELECT 
    t1.name, 
    SUM(t2.total_amount+t3.total_amount) 
FROM 
    userdetails t1 
        LEFT JOIN savings t2 
            ON t2.created_by=t1.id 
            AND t2.status=2 
        LEFT JOIN expense t3 
            ON t3.created_by=t1.id 
            AND t3.status=2 
WHERE 
    t1.link=12 
    AND t1.status=1 
GROUP BY 
    t1.name

【讨论】:

    【解决方案2】:
    select 
        u.Name,
        u.link,
        c.total
    from user_details u,
    (select 
        "created by",
        sum(amount) Total
    from 
        (select 
            "created by",
            amount
        from expense
        union all
        select 
            "created by",
            amount
        from savings)
        group by "created by") c
    where u.ID=c."created by"
    and  u.link=12;
    

    【讨论】:

      【解决方案3】:

      试试这个:

      SELECT A.Name,A.link,B.total
      FROM user_details A,
        (SELECT 'created by', SUM(amount) AS Total
        FROM
          (SELECT 'created by',amount
          FROM expense
          UNION ALL
          SELECT'created by',amount
          FROM savings)
        GROUP BY 'created by') B
      WHERE A.ID=B.'created by'
      AND A.link=12;
      

      您可以使用field_name 作为'Field Name''Column Title' 在结果中显示它。 确保表格中有 created by 列。

      【讨论】:

        猜你喜欢
        • 2015-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-05
        • 2016-10-25
        相关资源
        最近更新 更多