MYSQL通过连接获取求和
我正在寻找一个可能的解决方案,它将为我提供MYSQL通过连接获取求和,mysql,Mysql,我正在寻找一个可能的解决方案,它将为我提供用户表中的前3名用户,他们是根据他们的营业额订购的 这是我的用户和事务表的表模式 用户表格 id inviter_id 1 1 2 1 3 1 4 1 5 2 6 3 7 5 8 6 9 1 10 3 11 9 12 1 13 5 14 7 15 11 id payer _id
用户
表中的前3名用户,他们是根据他们的营业额
订购的
这是我的用户
和事务
表的表模式
用户
表格
id inviter_id
1 1
2 1
3 1
4 1
5 2
6 3
7 5
8 6
9 1
10 3
11 9
12 1
13 5
14 7
15 11
id payer _id amount
1 2 200
2 2 100
3 2 50
4 2 10
5 3 400
6 4 200
7 5 100
8 6 50
9 7 100
10 8 50
11 9 50
12 10 100
13 11 400
14 2 200
15 2 100
16 2 50
17 2 10
18 4 500
说明:id
表示用户的唯一id,inviter\u id
表示邀请用户的id
交易
表
id inviter_id
1 1
2 1
3 1
4 1
5 2
6 3
7 5
8 6
9 1
10 3
11 9
12 1
13 5
14 7
15 11
id payer _id amount
1 2 200
2 2 100
3 2 50
4 2 10
5 3 400
6 4 200
7 5 100
8 6 50
9 7 100
10 8 50
11 9 50
12 10 100
13 11 400
14 2 200
15 2 100
16 2 50
17 2 10
18 4 500
此处payer\u id
表示users
表中的用户
期望输出:
user_id turnover
//ID 1 should not be included in this table.
2 100 //ID 5 in `users` is referral of ID 2 so summing whatever ID 5 from `transactions` table using `payer_id` column we get : 100 (Sme process for other rows too)
3 150 //ID3's referrals : 6,10 | 50+100
4 0 //ID4's invited no one
5 100 //ID5's referrals : 7,13 | 100
6 50 //ID 6's referrals : 8 | 50
7 100 // ID 7's referrals : 14 | 0 (No rows for ID 14 in transactions table)
8 0 //No referrals invited
9 400 //ID9's referrals : 11 | 400
10 0 //No referrals invited
11 0 //ID11's referrals : 14 | 0 (No rows in txn table)
12 0 //No referrals invited
13 0 //No referrals invited
14 0 //No referrals invited
15 0 //No referrals invited
首先让我解释一下我是如何计算营业额的:
对于users表中的每个id
,让我们以id:1为例。我检查“邀请者id”列中的2。因此,无论谁在inviter\u id列中的值为2,这些id都被视为id 2的引用。
因此,我需要id 2的所有转介支付的金额的总和。类似地,对于其他ID,它们应按最高营业额排序
到目前为止,我尝试的是:
这是我的密码
select u.id AS user_id, u.address AS address, SUM(turnover) AS turnover
from users u left join
(select ur.id, ur.inviter_id, SUM(mt.userTurnover) as turnover
from users ur left join
(select m.payer_id, SUM(m.amount) as userTurnover
from matrix m where m.created >= $content_start AND m.type = 'escrow'
group by m.payer_id
) mt
on mt.payer_id = ur.id
where ur.created >= $content_start
group by ur.inviter_id
) ui
on ui.inviter_id = u.id
WHERE u.id != 1 AND u.id != 2 AND u.id != 3 AND u.id != 4
group by u.id
order by turnover desc LIMIT 10;
我得到的是用户本身的金额总和,而不是用户的每个推荐的付费金额。选择u1.id,COALESCE(sum(tr.amount),0)营业额
来自用户u1
在u1.id=u2.inviter\u id上左加入用户u2
u2.id=tr.payer\u id和u2.id!=u2.邀请者\u id
按u1.id分组
如果您需要usrs.id=1(即包括自引用)的总付款金额,则删除和u2.id!=u2.邀请者id
如果您不需要users.id=1的最后一行,请根据WHERE条件添加。谢谢您的帮助!是否已更新问题并添加注释,解释如何添加营业额。user\u id
7和8的值取自何处?用户7邀请没有付款的用户14,用户8不邀请任何人。为什么用户id=1存在一个自邀请行,而不为其他所有用户进行考试?(08aa51cef61d0945d035e36e2c3405e3)感谢您指出这一点。那是个错误。我已经更新了所需输出表中的所有行。因为ID1是第一个用户,所以他的邀请者就是ID1本身。无论如何,所需的输出表不应包含ID 1。我很高兴您理解了这个问题@AkinaPerfectly done是否可以获得每个用户id下的引用计数?@YaseenHussain当然,将相应的表达式(count(DISTINCT))添加到输出列表中。