MySQL:按条件分组

时间:2018-11-02 10:30:37

标签: mysql

我已经搜索了我的问题,但是我找不到真正想要的东西,或者也许我只是不理解示例。如果有类似的帖子,请指向正确的主题。

我想做的是以下操作:我得到的结果类似于下表,该表是通过非常简单的查询生成的:

SELECT id, first_name, last_name, email, roles, created 
FROM user

如您所见,用户可以具有两个角色:用户或老师。有些人只是老师,有些人只是用户。但是,其中一些既是教师又是用户。 现在,我想按电子邮件地址分组,但是这当然对用户和老师都不起作用。 我想通过电子邮件进行分组,以防某人兼有两个角色,我希望在结果中保留用户角色。我知道可以使用if条件完成此操作,但我不知道该在哪里或如何操作。

+------+------------+-----------+-----------------------+--------------+
| id   | first_name | last_name | email                 | roles        |
+------+------------+-----------+-----------------------+--------------+
| 9798 | person     | one       | personOne@gmail.com   | ROLE_USER    |
| 9800 | person     | one       | personOne@gmail.com   | ROLE_TEACHER |
| 9801 | person     | two       | personTwo@gmail.com   | ROLE_TEACHER |
| 9802 | person     | three     | personThree@gmail.com | ROLE_TEACHER |
| 9803 | person     | four      | personFour@gmail.com  | ROLE_USER    |
+------+------------+-----------+-----------------------+--------------+

所以我的查询应该是这样的:

SELECT id, first_name, last_name, email, roles, created 
FROM user
group by email (if count(email) > 1 "ROLE_USER from roles should end up in results")

有人能指出我正确的方向还是做出榜样?非常感谢!

3 个答案:

答案 0 :(得分:0)

这可能比您想像的要容易,但是就像您说的那样,是新手,可能还不了解。话虽这么说,但是尝试不针对您的数据方案解释其他命令会有点困难。您知道您所发布的帖子可能是3 ...用户,教师或两者兼而有之。我只需要添加一列即可代表按电子邮件分组的每种可能。现在,由于您要通过电子邮件进行分组,是否还需要“ ID”和“创建”字段?我不确定,但是为了防万一,我们会把它们扔进去。

select
      u.email
      max( u.first_name ) first_name,
      max( u.last_name ) last_name,
      max( case when u.roles = 'ROLE_USER' then 1 else 0 end ) IsUserRole,
      max( case when u.roles = 'ROLE_TEACHER' then 1 else 0 end ) IsTeacherRole
   from
      user u
   group by
      u.email

通过使用最大值(max)来表示名称,如果您有一个更改名称的人,或者输入错误的系统,您只会得到一个,但是如果名称相同,则没关系。至于用户/教师角色,如果记录返回true,则只返回1,否则返回0。这应该为您提供所需的东西。

答案 1 :(得分:0)

如果我正确地理解了这个问题,类似的东西应该会对您有所帮助

SELECT u.id,u.email, u.fname, u.llname, group_concat(r.role) FROM user u
 LEFT OUTER JOIN user r ON (u.email = r.email) GROUP BY u.email  

答案 2 :(得分:0)

如果只有两个角色,您可以

select * from t where roles = 'role_user'
union
select * from t where roles = 'role_teacher' and 
    ((select count(*) from t t1 where t1.email = t.email) = 1)
order by id;

+------+------------+-----------+-----------------------+--------------+
| id   | first_name | last_name | email                 | roles        |
+------+------------+-----------+-----------------------+--------------+
| 9798 | person     | one       | personOne@gmail.com   | ROLE_USER    |
| 9801 | person     | two       | personTwo@gmail.com   | ROLE_TEACHER |
| 9802 | person     | three     | personThree@gmail.com | ROLE_TEACHER |
| 9803 | person     | four      | personFour@gmail.com  | ROLE_USER    |
+------+------------+-----------+-----------------------+--------------+
4 rows in set (0.03 sec)

但是,如果电子邮件中有重复的角色,这将不起作用。