用UNION选择DISTINCT

时间:2019-05-06 01:58:47

标签: mysql

我的网站允许用户转介其他用户,在某些情况下,当转介的用户执行某些操作时,还会给他们奖励积分。

我想向推荐用户(她叫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获得相同的用户

1 个答案:

答案 0 :(得分:0)

您不需要floatleft 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.usernameusers.created_at定义不明确。

这还假设selectreferral_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中的值是什么。