mysql用userid选择两个表并比较时间戳并对其进行计数

时间:2017-02-10 17:45:53

标签: php mysql mysqli

您好我想我在这里尝试一些复杂的事情。也许你可以帮助我。

我有两张桌子:收入和支出。

收入将用户ID,金额,时间戳作为日期时间和其他内容。当用户赚取某些东西时,它只有信息。 例如:

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 | 
...

现在问我的问题。我想要计算未完成多少付款(谁没有付款输入)。这意味着。我需要将payouts.timestamp与具有相同用户ID的earnings.timestamp进行比较,并检查是否有更新的条目然后是支出。如果是,那么算一下(所以我认为这需要先收益)。我甚至不确定这是否可能。

如果不能单独使用mysql,我也可以使用php。

例如,结果应该是:count = 2,因为用户ID 1只有30个收入,所以他没有达到1000而且他没有在支付表中输入。用户ID 2有10000但他仍然没有支付,因为我们没有执行它或在支付表中输入。他只有一个旧的支出,新的收入没有支付。

编辑:10天前的事情就是例子。我使用真正的日期时间类型 编辑2:忘了说我试过这个:

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

然后去:

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

1 个答案:

答案 0 :(得分: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 |
+-------------------+

要查找未完成付款的用户,请使用不带COUNT()函数的相同查询:

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

在我看来,这种方式更稳定,因为最近付款的金额可能少于付款时的总用户收入,例如:

1)用户获得1000

2)然后用户赚了2000

3)之后用户已支付1000

在这种情况下,比较时间戳而不比较付款金额将显示此用户没有付款要做,而您仍然需要向他支付2000.