2017-02-10 3 views
0

こんにちは私はここで何か複雑なことをしようと思います。多分あなたはここで私を助けることができます。mysqlはuseridを持つ2つのテーブルを選択し、タイムスタンプを比較して数えます

私は2つのテーブルを持っています:収益と支払い。

収益には、datetimeと他のものとしてuserid、amount、timestampがあります。ユーザーが何かを稼いでいたときの情報だけです。 例:

id | user_id | amount | timestamp | 
1 | 2  | 1050 | 31days ago | 
2 | 1  | 20  | 10days ago | 
3 | 1  | 10  | 9 days ago | 
4 | 2  | 10000 | 9 days ago | 
... 

支払いは、日時として、ユーザーID、金額、タイムスタンプを持ち、ユーザーがX収入を上回っている場合の支払いについてのエントリを持っている今、私の問題に1000例

id | user_id | payout_amount | timestamp | 
1 | 2  | 1050   | 30days ago | 
... 

を言うことができます。いくつの支払いが行われていないか(支払いが決済されていない)の数をCOUNT個計算します。これの意味は。私はpayouts.timestampと同じユーザーIDを持っているearnings.timestampと比較し、新しいエントリーがあるかどうかをチェックする必要があります。はいの場合は、それを数えます(私はここで最初に収益を合計する必要があると思います)。これが可能かどうか私は確信していません。

mysqlだけではこれができないのなら、PHPでもできます。

たとえば、結果は次のようになります.userid1の収益は30にすぎないため、countid = 2であるため、1000にも達していないため、支払いテーブルにはエントリがありません。ユーザーID 2は10000ですが、支払いを実行していないか、または支払いテーブルにエントリを作成していないため、支払いはありません。彼はちょうど古い配当を持っていて、新しい収入は支払われません。

編集:10日前のものは単なる例です。

select COUNT(e.amount) FROM earnings e, payouts p where p.payout_timestamp < e.timestamp AND p.user_id = e.user_id GROUP BY p.user_id, e.user_id 

、これを行く:私はこの1つを試したと言うことを忘れ:私は EDIT2あり、実際の日時タイプの使用

| Count(e.amount) | 
| 2    | 
| 1    | 

答えて

1

を私は、タイムスタンプを比較すると、あなたのことを結果を取得するための唯一の方法ではないと思われます必要。これらの表が収益と支払いの履歴を正確に表している場合は、各ユーザーの合計収益と支払い額を合計し、収益よりもお支払い額が少ないuser_idごとに計算して比較することができます。たとえば :

SELECT user_id, SUM(amount) as amount FROM earnings GROUP BY user_id; 

は、ユーザーごとに業績を集計

SELECT user_id, SUM(payout_amount) as amount FROM payouts GROUP BY user_id; 

は、ユーザーごとに支払いを集計します。今左

それらを結合して、収益未満の支払いを持っているユーザーカウント:私の結果だったあなたのテーブル例えば

SELECT COUNT(e1.user_id) FROM (SELECT user_id, SUM(amount) as amount FROM earnings GROUP BY user_id) as e1 LEFT JOIN (SELECT user_id, SUM(payout_amount) as amount FROM payouts GROUP BY user_id) as p1 ON e1.amount > p1.amount; 

を:

+-------------------+ 
| COUNT(e1.user_id) | 
+-------------------+ 
|     2 | 
+-------------------+ 

そして、ちょうど使用し行われていないの支払いを持つユーザーを見つけますこの方法は、より多くの駅である私の意見では

+---------+ 
| user_id | 
+---------+ 
|  2 | 
|  1 | 
+---------+ 

:COUNT()関数のない同じクエリ

1)利用者が1000

2を獲得した後、ユーザーが2000

3)とを獲得した):例えば、支払いの時点での総利用者の利益よりも少ない量、と最近の支払いを持つことが可能であるため、BLEそのユーザーが支払われた後1000

このような状況では、支払い額を比較しないタイムスタンプを比較すると、このユーザーには支払いが行われず、2000を支払う必要があります。

関連する問題