MySQL / PHP:选择具有未结余额的作业

时间:2011-12-14 20:48:42

标签: php mysql

希望我能在不写书的情况下做到这一点......我正在为一家测量公司工作。他们还投入了一个会计部门,其中一个功能是找到没有完全还清的工作。

要点几点:

  • “工作”本质上是一个项目。有不同类型的调查。
  • 一份工作可以有多种“类型”的调查,因此有多个价格计入工作的总价格。
  • 付款是针对个别工作的(如果他们有30个工作,客户可能会发送30张支票,这是会计工作)
  • 作业类型是动态的(他们可以从系统面板创建/删除它们) - 所以我无法对这些内容进行硬编码

以下是适用的数据库结构:

table jobs: job_id, client_id
table job_types: type_id, type_name
table job_type_assoc: id_job, type_id, price
table payments: payment_id, job_id, amount

注意:不是对每种工作类型进行付款,而是对整个工作进行付款(再次,与客户的帐户有“余额”)相反。

我需要以某种方式拉取pricejob_type_assoc的总数小于amountpayments总数的工作。

我不知道单独使用mysql是否可行,或者php是否更有效 - 而且,他们的旧系统中有大约340,000个作业。当然,他们不会有会计信息,他们确实有很多工作,新的条目会很快建立起来,如果我在PHP中以某种方式做到这一点,我最终会查询作业表,它可能会得到很多凌乱。

1 个答案:

答案 0 :(得分:2)

一种可行的方法是使用子查询的巧妙组合。

select * from 
  (select job_id,
    (select ifnull(sum(job_type_assoc.price),0) from job_type_assoc
       where jobs.job_id = job_type_assoc.id_job) as amount_due,
    (select ifnull(sum(payments.amount),0) from payments
       where jobs.job_id = payments.job_id) as payments
    from jobs) as outstanding
  where payments< amount_due;

如果您正确编制了job_type_assoc和付款索引,那么运行查询应该不会太糟糕。

请注意,我尚未测试此确切查询,因此可能需要进行调整。我对本地数据库中的表运行相同的查询。