2

現在の状況で機能するクエリを生成するのに問題があります。詳細は次のとおりです...

1テーブル=請求
1テーブル=請求日

請求=基本的に請求書が生成されると、主キー、請求書ID、ユーザーID、ユーザーユーザー名、実際の名前、請求日、請求書の合計、および行われた支払いを使用して請求の行が作成されます。

請求日=請求書に対して支払いが行われると、主キー、ID(請求テーブルの主キーと同じ)、請求書ID(の請求書IDと同じ)を使用して請求日の行が作成されます。請求)、ユーザーID(請求のユーザーIDと同じ)、支払日、支払額

未処理の各請求書をプルして、PHPの30/60/90/90+テーブルにエンドユーザーに表示するエージングレポートを作成しようとしています。したがって、請求書#12に100ドルの残高があり、10ドルの支払いが2回あり、請求書が60日経過している場合、この情報がレポートに表示されます。これが私が持っているものです...

 $sql17 = "SELECT 
 $mysql_billing.login_id, $mysql_billing.primary_key, $mysql_billing.a_name,
 SUM($mysql_billing.custotal) AS finaltotal,
 SUM($mysql_billing_dates.amount) AS paidtotal,
 $mysql_billing.custotal - $mysql_billing_dates.amount AS total
 FROM $mysql_billing
 LEFT JOIN $mysql_billing_dates ON $mysql_billing.login_id = $mysql_billing_dates.login_id
 GROUP BY login_id
 ORDER BY a_name ASC";

私がそれを実行すると、いくつかは正しいですが、ほとんどは正しくありません。矛盾が何であるか理解できません。何かアイデアをいただければ幸いです。間違った道を進んでいるのではないでしょうか。 詳細
次のことを行うと、正しい値が表示されます...

 SELECT 
 $mysql_billing.login_id, $mysql_billing.primary_key, $mysql_billing.a_name,
 SUM($mysql_billing.custotal) AS finaltotal
 FROM $mysql_billing
 GROUP BY login_id
 ORDER BY a_name ASC

しかし、元の例では、常に正しい値を取得するとは限りませんか?

4

2 に答える 2

1

さて、私は何が起こっているのか理解していると思います。

したがって、おそらくどちらのテーブルも、login_idごとに複数のレコードを持つことができます。これが、合計とgroupbyを実行している理由です。ただし、集計とgroup byを取得すると、クエリから何が返されるかを確認してください。問題を理解できると思います。

login_id xxx1234に2つのレコードがあるテーブル1と、そのlogin_idに3つのレコードがあるテーブル2があるとします。次に、それらに参加したままにすると、6つのレコードを取得します。

例えば

table 1:
  login, custotal
  xxx111, 10
  xxx111, 20

table 2:
  login, amount
  xxx111, 30
  xxx111, 40
  xxx111, 50

after the join:
  login, custotal, amount
  xxx111 10, 30
  xxx111 10, 40
  xxx111 10, 50
  xxx111 20, 30
  xxx111 20, 40
  xxx111 20, 50

したがって、合計で予想した金額の数倍になる可能性があります。

代わりにやりたいことは次のようなものです。

 SELECT 
 billing_totals.login_id, billing_totals.primary_key, billing_totals.a_name, 
 billing_totals.finaltotal,
 billing_dates_totals.paidtotal,
 (billing_totals.finaltotal - billing_dates_totals.paidtotal) AS total
 FROM
   (SELECT $mysql_billing.login_id, 
   $mysql_billing.primary_key, 
   $mysql_billing.a_name, 
   SUM($mysql_billing.custotal) AS finaltotal 
   FROM $mysql_billing GROUP BY login_id) billing_totals 
 LEFT JOIN 
   (SELECT $mysql_billing_dates.login_id, 
   SUM($mysql_billing_dates.amount) AS paidtotal 
   FROM $mysql_billing_dates GROUP BY login_id) billing_dates_totals 
 ON (billing_totals.login_id = billing_dates_totals.login_id) 
 ORDER BY a_name ASC";

現時点でテストするmysqlがないため、おそらく少し調整する必要があります。

于 2012-10-01T06:49:29.320 に答える
0

$sql17 = "SELECT $mysql_billing.login_id, $mysql_billing.primary_key, $mysql_billing.a_name, SUM($mysql_billing.custotal) AS finaltotal, SUM($mysql_billing_dates.amount) AS paidtotal, SUM($mysql_billing.custotal) - SUM($mysql_billing_dates.amount) AS total FROM $mysql_billing LEFT JOIN $mysql_billing_dates ON $mysql_billing.login_id = $mysql_billing_dates.login_id GROUP BY login_id ORDER BY a_name ASC";

編集:私はあなたのためにこのようなことを試みました。

SELECT a.id, (select sum(custotal) from `billing` where id=a.id) as total1,(select sum(amount) 
from `billing_dates`
where id=a.id) as total1 from `billing` a
于 2012-10-01T06:55:57.267 に答える