[英]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.