簡體   English   中英

MySQL:按條件分組

[英]Mysql: Group by with condition

我已經搜索過我的問題,但是我找不到真正想要的東西,或者也許我只是不理解示例。 如果有類似的帖子,請指出正確的主題。

我要嘗試的操作如下:我得到的結果如下表所示,該表是通過非常簡單的查詢生成的:

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 ...用戶,教師或兩者兼而有之。 我只需要添加一列即可代表按電子郵件分組的每種可能。 現在,由於您要通過電子郵件進行分組,是否還需要“ 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。 這應該為您提供所需的東西。

如果我理解正確的問題,類似的東西應該可以幫助您

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個角色,您可以

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)

但是,如果電子郵件中有重復的角色,則此方法將無效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM