我的网站允许用户转介其他用户,在某些情况下,当转介的用户执行某些操作时,还会给他们奖励积分。
我想向推荐用户(她叫Amy,她的用户ID为3)显示她推荐了谁以及获得了多少积分。
此查询获取Amy推荐的用户以及他们为她生成的积分。它工作正常。
SELECT users.username, users.created_at, SUM(reward_total)
AS total
FROM referral_points
JOIN users ON users.id = referral_points.user_id
WHERE referral_points.referred_by = 3
GROUP BY user_id
但是,有些注册用户并没有做任何事情来为Amy生成积分,但是我仍然想向她展示他们的身份。
此查询可获取Amy推荐的所有用户,无论其得分如何。
SELECT users.username, users.created_at, users.updated_at
FROM users
WHERE users.referred_by = 3
我在使用UNION联接查询时遇到了困难。它们产生结果,但是结果是重复的,因为我从referral_points
获得用户,而从users
获得相同的用户
答案 0 :(得分:0)
您不需要float
,left join
就是这种情况:
union
它将为您提供Amy推荐的所有用户,无论他们是否具有推荐点(例如,对于该用户,左侧表中是否有任何内容都无关紧要) ,他们被总结。
这需要SELECT users.username, users.created_at, SUM(referral_points.reward_total) AS total
FROM users
LEFT JOIN referral_points ON users.id = referral_points.user_id
WHERE users.referred_by = 3
GROUP BY users.user_id
作为主键,否则users.user_id
中的users.username
和users.created_at
定义不明确。
这还假设select
和referral_points.referred_by
的值是相同的(或者您的问题中有错别字,而您的意思是users.referred_by
)-实际上,您不应该(也)然后在users.referred_by
中具有该值,因为它是重复的并且可能是模棱两可的。但是,以防万一它是故意的(例如,如果它可以与referral_points
中的值不同),则可以使用与原始查询相同的结果,可以使用:
users.referred_by
它列出了Amy(...
WHERE users.referred_by = 3 and referral_points.user_id is null
or referral_points.referred_by = 3
GROUP BY users.user_id
)所推荐的所有用户,而Amy(users.referred_by
)没有所推荐的用户,或者Amy(referral_points.referred_by
所具有的推荐用户,所有用户都被列出。 ),无论referral_points.referred_by
中的值是什么。