mysql - 多重连接

标签 mysql join group-by

鉴于这些表的定义和关系:

jobs  
tasks  
invoice_item  
invoice_payment  

工作是一切的根源。
每个工作都有多个任务,例如工作可能是 build 一把椅子,任务可能是所需的步骤。每个任务都有一定的计划价格,因此购买椅子的木材可能需要 400。

每个任务都可以通过发票进行计费,发票存储在两个表中,一个表保存发票 ID(invoice_item),另一个表保存发票付款详细信息,例如计费金额和计费任务。

每个任务可以有多个发票,例如我们的任务成本为 400,可以有 4 张发票,每张发票为 100。

要求:

在其自己的行中显示每个作业并包含以下信息:
1. 作业的计划价格总和
2. 已为该工作计费的金额
3.职位描述

我创建了这个 sqlfiddle 来提供基本的数据结构。 http://sqlfiddle.com/#!2/0be74 该数据集的预期结果是:

(job_description, SUM(planned), SUM(billed))  
VALUES  
('Project A', 2000, 1900),    
('Project B', 3000, 2000) 

我当前唯一的解决方案严重失败:

Select j.job_description, SUM(t.task_planned_price),SUM(p.invoice_amount)
FROM jobs as j
LEFT JOIN tasks as t ON t.job_id = j.job_id
JOIN invoice_item as i ON i.task_id = t.task_id
JOIN invoice_payment as p ON p.invoice_id = i.invoice_id
GROUP BY j.job_id

我将非常感谢任何关于我做错了什么的指导和一些提示(或答案)。 您可以将我的解决方案直接复制到 sqlfiddle 并查看有什么问题。

提前致谢,很抱歉问了这么长的问题!

最佳答案

当您将任务连接到发票项目和发票付款时,发票金额总和不正确,因为任务行数乘以发票付款行数 * 发票金额行数,您需要将它们单独分组。

select j.job_description, t1.sum_task_planned_price, 
       coalesce(t2.sum_invoice_amount,0) sum_invoice_amount
from jobs j join (
    select job_id, sum(task_planned_price) sum_task_planned_price
    from tasks
    group by job_id
) t1 on t1.job_id = j.job_id
left join (
    select t.job_id, sum(p.invoice_amount) sum_invoice_amount
    from tasks t
    join invoice_item as i on i.task_id = t.task_id
    join invoice_payment as p on p.invoice_id = i.invoice_id
    group by t.job_id
) t2 on t1.job_id = t2.job_id

http://sqlfiddle.com/#!2/0be74/8

关于mysql - 多重连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25107913/

相关文章:

java - 使用 JDBC 查询数据库的最有效方式?

sql-server - 统计group by返回的记录数

php - 使用选择框动态创建行使用php在mysql中选择多个值

php - MySQL DATETIME 问题

sql - "table A left outer join table B ON TRUE"是什么意思?

MySQL:如何将列别名与特定的 JOIN 子句相关联

mysql - 如何使用 GROUP BY 获取与组关联的所有用户并键入

sql - 如何将具有相同列的两个表转换为一个添加计数并按第三个表分组

PHP - SQL 不返回行但在本地服务器上工作

mysql - 如何从IP连接到MySQL数据库?