我正在尝试生成一份报告,其中显示了热门推荐人以及他们推荐的人员产生了多少收入。
这是我的表格的缩写版本:
Users Table
------------------
id
referral_user_id (references another record in the users table)
username
firstname
lastname
Transactions Table
-------------------
id
user_id
amount
我尝试过使用以下查询:
SELECT
users.id,
users.firstname,
users.lastname,
users.username,
COUNT(referrals.id) referrals,
SUM(transactions.amount) income
FROM `users`
LEFT JOIN `users` AS `referrals` ON `users`.`id` = `referrals`.`referral_user_id`
LEFT JOIN `transactions` ON `referrals`.`id` = `transactions`.`user_id`
GROUP BY `users`.`id`
ORDER BY `income` desc
我得到以下结果:
ID | username | Name | Referrals | Revenue From Referrals
----------------------------------------------------------------------------
1 jj Jason 136 6536.30
2 jim Jim 206 2957.75
3 tim Tim 67 2712.10
唯一的问题是数字不加起来。当我执行查询SELECT COUNT(id) FROM users WHERE referral_user_id = 1
时,我的计数为77,当我SELECT COUNT(id) FROM users WHERE referral_user_id = 2
时,我的计数为161。
当我删除查询的事务/收入部分时,只需执行此操作:
SELECT
users.id,
users.firstname,
users.lastname,
users.username,
COUNT(referrals.id) referrals
FROM `users`
LEFT JOIN `users` AS `referrals` ON `users`.`id` = `referrals`.`referral_user_id`
GROUP BY `users`.`id`
ORDER BY `referrals` desc
我得到了正确的推荐计数。有人能解释一下我的遗失吗?
答案 0 :(得分:1)
可能是你对聚合在SQL中的工作原理做了错误的假设。
假设您在没有GROUP BY和聚合的初始查询中加入,它可以提供以下数据:
用户1与[2,3]链接,金额[100,200]在加入时将我们带到4条记录
ID | username | Name | referral_user_id | Amount
----------------------------------------------------------------------------
1 jj Jason 2 100
1 jj Jason 3 200
1 jj Jason 3 100
1 jj Jason 2 200
使用您的查询将对上述结果进行分组:
注意它没有帮助放置COUNT(referrals.id),COUNT(1)将给出相同的结果。
对于参考,你可以使用COUNT(DISTINCT referrals.id),IF和ONLY,如果你没有多次计算a和b之间的关系。
否则,您应该使用子查询来确定金额。