如何编写SQL的Order By语句实现主账号优先的团队关联排序?
解决方案
你需要通过多层排序条件来实现需求,核心是先区分有主账号的团队和无主账号的团队,再保证同团队主辅账号相邻:
SELECT user_name, Usertype, Team FROM users ORDER BY -- 第一步:有主账号的团队整体前置,无主账号的团队放最后 CASE WHEN EXISTS (SELECT 1 FROM users u2 WHERE u2.Team = users.Team AND u2.Usertype = 'Main') THEN 0 ELSE 1 END, -- 第二步:同团队的用户归为一组 Team, -- 第三步:同团队内主账号优先显示 CASE Usertype WHEN 'Main' THEN 0 ELSE 1 END
逻辑说明
- 第一层排序:用
EXISTS子查询判断当前用户的团队是否存在主账号,存在的标记为0(靠前),不存在的标记为1(靠后),直接把无主账号的团队整体推到末尾。 - 第二层排序:按
Team分组,确保同团队的所有用户都相邻排列。 - 第三层排序:给主账号标记
0、辅账号标记1,保证同团队内主账号排在辅账号前面。
为什么之前的写法不符合需求
ORDER BY usertype, team:会先把所有主账号按团队排序,再把所有辅账号按团队排序,导致同团队的主辅账号被分开。ORDER BY team, usertype:会按团队字母顺序排序,不管该团队有没有主账号,所以无主账号的团队可能因为字母靠前排在前面,不符合“无主账号团队放末尾”的要求。
内容的提问来源于stack exchange,提问作者Thomas Hoang
相关产品推荐
相关产品推荐

