Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何根据其他联接表条件选择某些表字段的总和?_Mysql_Sql_Mariadb - Fatal编程技术网

Mysql 如何根据其他联接表条件选择某些表字段的总和?

Mysql 如何根据其他联接表条件选择某些表字段的总和?,mysql,sql,mariadb,Mysql,Sql,Mariadb,我一直在做一个费用跟踪系统。我有三个主要表格:“费用”、“费用报告”、“付款” 我的数据库结构如下: “费用”属于一个“费用报告” “费用报告”有许多“费用” “费用报告”属于许多“付款” “付款”属于许多“费用报告” 我为“费用报告”和“付款”表添加了一个数据透视表,即“费用报告付款”,以处理多对多关系“费用报告付款”表包含ff字段: 身份证 费用报告id 付款id 付款 这是我获取费用和付款总额的查询: SELECT IFNULL(SUM(ex.`amount`), 0) AS

我一直在做一个费用跟踪系统。我有三个主要表格:“费用”、“费用报告”、“付款”

我的数据库结构如下:

  • “费用”属于一个“费用报告”
  • “费用报告”有许多“费用”
  • “费用报告”属于许多“付款”
  • “付款”属于许多“费用报告”
我为“费用报告”和“付款”表添加了一个数据透视表,即“费用报告付款”,以处理多对多关系“费用报告付款”表包含ff字段:

  • 身份证
  • 费用报告id
  • 付款id
  • 付款
这是我获取费用和付款总额的查询:

SELECT 
  IFNULL(SUM(ex.`amount`), 0) AS total_expenses,
  IFNULL(SUM(erp.`payment`), 0) AS total_payment 
FROM
  `expenses` ex 
  JOIN `expense_reports` er 
    ON er.`id` = ex.`expense_report_id` 
  LEFT JOIN `expense_report_payment` erp 
    ON erp.`expense_report_id` = er.`id` 
  JOIN `payments` p 
    ON p.`id` = erp.`payment_id` 
    AND p.`deleted_at` IS NULL 
    AND p.`cancelled_at` IS NULL 
    AND p.`received_at` IS NOT NULL 
WHERE ex.`deleted_at` IS NULL 
  AND er.`deleted_at` IS NULL 
  AND er.`rejected_at` IS NULL 
  AND er.`cancelled_at` IS NULL 

如果有收到的付款(总费用=100;总付款=100),我会得到总金额。但是,如果尚未收到付款,则费用和付款的总金额均为零。

左联接
表格。通常,您还应该将右侧联接表上的
WHERE
条件移动到
LEFT JOIN
s
on
子句。试一试

SELECT 
  IFNULL(SUM(ex.`amount`), 0) AS total_expenses,
  IFNULL(SUM(erp.`payment`), 0) AS total_payment 
FROM
  `expenses` ex 
  LEFT JOIN `expense_reports` er 
    ON er.`id` = ex.`expense_report_id` 
      AND er.`deleted_at` IS NULL 
      AND er.`rejected_at` IS NULL 
      AND er.`cancelled_at` IS NULL    
  LEFT JOIN `expense_report_payment` erp 
    ON erp.`expense_report_id` = er.`id` 
  LEFT JOIN `payments` p 
    ON p.`id` = erp.`payment_id` 
    AND p.`deleted_at` IS NULL 
    AND p.`cancelled_at` IS NULL 
    AND p.`received_at` IS NOT NULL 
WHERE ex.`deleted_at` IS NULL 
  

左联接
表。通常,您还应该将右侧联接表上的
WHERE
条件移动到
LEFT JOIN
s
on
子句。试一试

SELECT 
  IFNULL(SUM(ex.`amount`), 0) AS total_expenses,
  IFNULL(SUM(erp.`payment`), 0) AS total_payment 
FROM
  `expenses` ex 
  LEFT JOIN `expense_reports` er 
    ON er.`id` = ex.`expense_report_id` 
      AND er.`deleted_at` IS NULL 
      AND er.`rejected_at` IS NULL 
      AND er.`cancelled_at` IS NULL    
  LEFT JOIN `expense_report_payment` erp 
    ON erp.`expense_report_id` = er.`id` 
  LEFT JOIN `payments` p 
    ON p.`id` = erp.`payment_id` 
    AND p.`deleted_at` IS NULL 
    AND p.`cancelled_at` IS NULL 
    AND p.`received_at` IS NOT NULL 
WHERE ex.`deleted_at` IS NULL 
  

谢谢大家的帮助。我通过在左联接中联接“费用报告付款”和“付款”表,成功地解决了这个问题

SELECT 
  IFNULL(SUM(ex.`amount`), 0) AS total_expenses,
  IFNULL(SUM(erp.payment), 0) AS total_payment
FROM
  `expenses` ex 
  JOIN `expense_reports` er 
    ON er.`id` = ex.`expense_report_id` 
    AND er.`deleted_at` IS NULL 
    AND er.`rejected_at` IS NULL 
    AND er.`cancelled_at` IS NULL 
  LEFT JOIN 
    (SELECT 
      ep.*
    FROM
      `expense_report_payment` ep 
      JOIN `payments` p 
        ON p.`id` = ep.`payment_id`
    WHERE p.`received_at` IS NOT NULL
    AND p.`deleted_at` IS NULL
    AND p.`cancelled_at` IS NULL
    ) AS erp 
    ON erp.expense_report_id = er.`id` 
WHERE ex.`deleted_at` IS NULL 

谢谢大家的帮助。我通过在左联接中联接“费用报告付款”和“付款”表,成功地解决了这个问题

SELECT 
  IFNULL(SUM(ex.`amount`), 0) AS total_expenses,
  IFNULL(SUM(erp.payment), 0) AS total_payment
FROM
  `expenses` ex 
  JOIN `expense_reports` er 
    ON er.`id` = ex.`expense_report_id` 
    AND er.`deleted_at` IS NULL 
    AND er.`rejected_at` IS NULL 
    AND er.`cancelled_at` IS NULL 
  LEFT JOIN 
    (SELECT 
      ep.*
    FROM
      `expense_report_payment` ep 
      JOIN `payments` p 
        ON p.`id` = ep.`payment_id`
    WHERE p.`received_at` IS NOT NULL
    AND p.`deleted_at` IS NULL
    AND p.`cancelled_at` IS NULL
    ) AS erp 
    ON erp.expense_report_id = er.`id` 
WHERE ex.`deleted_at` IS NULL 

在连接链中,必须在第一个连接后使用左连接<代码>付款已加入到<代码>费用_报表_付款,因此它位于左连接链中,并且必须左连接。必须在连接链中的第一个后使用左连接<代码>付款已加入到<代码>费用_报告_付款,因此它位于leftjoined链中,必须也加入leftjoined。感谢您的回复。我尝试了你的建议,但它仍然显示付款,即使付款尚未收到。这就是为什么我首先加入了“付款”表和“费用报告付款”表的原因。谢谢您的回复。我尝试了你的建议,但它仍然显示付款,即使付款尚未收到。这就是为什么我首先加入了“付款”表和“费用报告付款”表。