SQL - 多个用户组中的用户多次返回同一用户

时间:2015-06-12 13:40:02

标签: mysql

好的,我有四个表:usersgroupsusergroupsworkloadtracker。你可以想象,usergroups是我的"通过" usersgroups之间的表格。 workloadtracker只是一张包含user_id的表格,可以跟踪工作量。

我有以下sql:

SELECT DISTINCT u.*,ug.*,w.*
FROM users as u 
LEFT JOIN users_groups as ug ON u.id = ug.user_id 
JOIN workloadtracker as w ON u.id = w.userid 
WHERE w.crmid is not null
      and ug.group_id != 2
      and ug.group_id != 1
      and ug.group_id != 7
      and ug.group_id != 17
      and ug.group_id != 21
      and ug.group_id != 22
order by w.points desc

这为我提供了我想要的信息......某些群组中用户的工作量.....但如果用户在多个群组中,他会出现不止一次。我怎么能阻止这个?

2 个答案:

答案 0 :(得分:2)

DISTINCT不会将结果限制为单个用户实例,因为您要包含users_groups中的所有字段。

对于多个组中的用户,users_groups中有多条记录,因此您的查询会为这些用户返回多条DISTINCT记录。

快速解决方案是删除' ug。*'来自您的SELECT子句。

编辑: 如果您需要有关用户所在组/组的信息,可以使用带聚合函数的GROUP BY子句。 例如,他们所在的群组数量:

SELECT DISTINCT u.*,w.*,COUNT(ug.group_id) AS num_groups
FROM users as u 
LEFT JOIN users_groups as ug ON u.id = ug.user_id 
JOIN workloadtracker as w ON u.id = w.userid 
WHERE w.crmid is not null
      and ug.group_id != 2
      and ug.group_id != 1
      and ug.group_id != 7
      and ug.group_id != 17
      and ug.group_id != 21
      and ug.group_id != 22
GROUP BY u.id
order by w.points desc

答案 1 :(得分:2)

如果您想要组列表,请使用聚合:

SELECT u.*, w.*, group_concat(ug.group_id) as groups
FROM users au JOIN
     workloadtracker w
     ON u.id = w.userid LEFT JOIN
     users_groups ug
     ON u.id = ug.user_id and
        ug.group_id not in (2, 1, 7, 17, 21, 22)
WHERE w.crmid is not null
GROUP BY u.id
ORDER BY w.points desc;

一些注意事项:

  • 我在JOIN之前移动了LEFT JOIN。这是一个惯例。它可以更容易地查看哪些连接正在过滤初始数据(并且它可以防止某些类型的错误)。
  • 我将group_id上的条件更改为使用not in
  • 我将该条件移至on子句。否则,left join会变为inner join
  • 这假设w表没有为每个用户提供多行。否则,您可能还希望聚合该表中的列。