【问题标题】:mysql - multiple joinsmysql - 多个连接
【发布时间】:2014-08-03 18:45:55
【问题描述】:

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

jobs  
tasks  
invoice_item  
invoice_payment  

工作是一切的根源。
每个工作都有多个任务,例如,工作可能是建造一把椅子,而任务可能是所需的步骤。每个任务都有一定的计划价格,所以购买椅子的木头可以花费 400。

每个任务都可以通过发票开具账单,发票存储在两个表中,一个表保存 invoice_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 中,看看有什么问题。

提前致谢,很抱歉这个问题太长了!

【问题讨论】:

    标签: mysql join group-by


    【解决方案1】:

    当您将任务加入发票项目和发票付款时,发票金额的总和不正确,因为任务行数乘以发票付款行数 * 发票金额行数,您需要将这些单独分组。

    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

    【讨论】:

      【解决方案2】:

      根据您的示例数据验证工作,尽量使其简单到有助于理解。

      select jobs.job_id, 
             jobs.job_description, 
             sum(invoice_amount), 
             PP.PPSUM 
      from   jobs, 
             tasks, 
             invoice_payment, 
             invoice_item, 
             (select job_id, sum(task_planned_price) as PPSUM from tasks group by job_id) as PP
      where  jobs.job_id = tasks.job_id 
             and invoice_item.task_id = tasks.task_id 
             and invoice_payment.invoice_id = invoice_item.invoice_id 
             and PP.job_id = jobs.job_id
      group by jobs.job_id
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-31
        • 2011-11-25
        • 2015-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-18
        相关资源
        最近更新 更多