2016-09-10 11 views
0

ここに私の2つのmysqlテーブルです。 clientsテーブルにユーザ接続日が表示され、clients_pay_bill接続日(conn_date)からユーザに請求された月を示すテーブルに表示されます。2か月から月数と日数のある月をすべて取得しますか?

a)は、クライアント

clients_id conn_date 
======================= 
1    2016-06-01  
2    2016-07-17 
3    2016-06-22 
4    2016-09-03 

b)はclients_pay_bill

cpp_id  clients_id paid_month 
=================================== 
1   1    2016-07-03 
2   2    2016-07-22 
3   4    2016-09-09    
4   2    2016-07-22 

は今、私はすべての月 クライアントは、現在の日付まで支払わされていないの日数や月数で示したいと思います。例えば

clients_id = 1接続日(conn_dateは)2016年6月1日であり、彼は唯一の今まで2016年7月3日月の法案を支払いました。だから、SQLクエリは、数ヶ月次のような出力になります。

2016-06 
2016-08 
2016-09 
**2016-07 will not print because he already paid this months bill** 

、私はまた、日や月などの数を表示したい:3ヶ月何日かは...

はどのようにSQLクエリがすべき私は想像することはできませんのように見える ?

+0

http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-クエリ – Strawberry

答えて

0

これは論理的にもパフォーマンス的にもあなたを殺してくれる少し異なるアプローチをお勧めします。それが行われるべき方法は、clients_pay_billに記録された記録を誰かが支払うべきときではなく、それに加えて2列:due_datepaid_dateとする必要があるときに記録することです。だからあなたのテーブルには、次のようになります。

cpp_id  clients_id  due_month  paid_month 
==================================================== 
1   1    2016-06-03  NULL 
1   1    2016-07-03  2016-07-03 
1   1    2016-08-03  NULL 
2   2    2016-09-22  NULL 
3   4    2016-09-09  NULL 
4   2    2016-07-22  NULL 

あなたがcronを介して、毎月によるノートを生成したり、イベントを介したよりもSQLに滞在することを好む場合があります。その後、paid_month列を更新するよりも支払が完了した場合に、支払期日がNULLである期日ノートを選択する簡単なクエリがあります。

について日私はあなたが(例は役立つだろう)が、達成したいと思いますどのような影響かわからない、それはすでにこれらのレコードに日量に関する計算を行うために半分の方法(例えば。DATEDIFF付き)ですによるノートのリストを持つ

+0

ああ本当に素晴らしいアイデアですが、最初はすべてのdue_monthを挿入する必要がありますか? –

+0

はい、due_monthを最初に設定する必要があります(たとえば、conn_dateから毎月、または毎月1日ごとに期限を挿入することを希望する場合) – StormoPL

関連する問題