2011-12-14 7 views
2

私は本を書くことなくこれを行うことができます。私は測量会社のシステムに取り組んでいます。彼らは会計部門にも投げかけており、必要な機能の1つは、完全に報われていない仕事を見つけることです。MySQL/PHP:貸借残高のあるジョブの選択

なされるべきいくつかの点:

  • '仕事' は、本質的に、プロジェクトです。さまざまなタイプのアンケートがあります。
  • ジョブに複数の「タイプ」の調査が含まれている可能性があります。したがって、ジョブの合計価格に計算される複数の価格があります。
  • 個々のジョブで支払いが行われます(クライアントは30のジョブを持っていると30のチェックを送信することがあります)。
  • ジョブタイプは動的です(システムパネルからジョブを作成/削除できます)。クライアントのとは反対に、支払いは各ジョブの種類に作られていないが、やはり全体(としてJOB:

    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 
    

    注:「tはこれらの事

ここで該当するデータベース構造だがハードコーディングアカウントには「残高」があります)。

priceからjob_type_assocまでの合計がamountからpaymentsに満たないジョブを何とかプルする必要があります。

これはmysql単独で可能か、phpがより効率的かどうかわかりません。また、古いシステムには約340,000のジョブがあります。彼らが会計情報を持っていないことを認めれば、彼らは多くの仕事をしており、新しいエントリーは素早く構築されます。そして、もし私が何とかPHPでそれをやって、汚い。

答えて

2

可能な方法の1つは、サブクエリの賢明な組み合わせです。

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と支払いを正しく索引付けしている場合は、これを実行するクエリを悪くしないでください。

この正確なクエリはテストしていないため、調整が必要な場合があります。私は自分のローカルDBのテーブルに対して同じクエリを実行しました。

+0

私の友人であることを願います。これは素晴らしいです。本当にありがとうございました! –