您好我想我在这里尝试一些复杂的事情。也许你可以帮助我。
我有两张桌子:收入和支出。
收入将用户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 |
答案 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.