SQL按user和page分组时如何将permission转为列合并为单行输出
现有写法的问题
- 直接使用
SELECT * FROM t1 GROUP BY user, page不符合SQL分组查询的语法规范:分组查询规则要求SELECT子句中仅可出现分组维度字段(你这里的user、page),或是被聚合函数包裹的非分组字段。你直接写*会尝试返回未做聚合处理的permission字段,大多数数据库要么会直接抛出语法错误,要么仅返回每个分组内第一条记录的permission值,自然无法输出所有权限的标记结果。
正确实现方案
你要做的是典型的行转列操作,使用单表的条件聚合即可实现,仅需一次表扫描,效率远高于多表关联方案,参考SQL如下:
SELECT user, page, MAX(CASE WHEN permission = 'read' THEN 'X' ELSE '' END) AS `read`, MAX(CASE WHEN permission = 'edit' THEN 'X' ELSE '' END) AS `edit`, MAX(CASE WHEN permission = 'delete' THEN 'X' ELSE '' END) AS `delete` FROM t1 GROUP BY user, page
实现逻辑说明
- 对每个
user + page的分组,分别对三种权限做条件判断:只要分组内存在对应权限的记录,CASE WHEN就会返回X,经过MAX聚合后对应列就会显示X - 若分组内没有对应权限的记录,最终返回的就是空字符串,和你预期的输出格式完全匹配
内容的提问来源于stack exchange,提问作者santa
相关产品推荐
相关产品推荐

