ppgjx 发表于 2022-5-27 16:10

sql case when分组后 如何针对每个组进行排序

本帖最后由 ppgjx 于 2022-5-27 18:42 编辑

我用一个user表 下面是字段

user_id 用户id
online 在线,0离线,1勿扰,2在聊,3在线
isauthor_auth 是否主播认证 0 否 1 是 没有主播认证就是普通用户
login_time 最后登录时间


我现在需要 在线认证主播 -> 离线认证主播 -> 在线非认证主播 -> 离线非认证主播 -> 在线普通用户 -> 离线普通用户 经过大佬回答是这样写的

select * from cmf_user where user_type = 2 and user_status = 1 and sex = 1order by case when isauthor_auth = 1 and online != 0 then 1when isauthor_auth = 1 and online = 0 then 2 when isauthor_auth = 0 and online != 0 then 3when isauthor_auth = 0 and online = 0 then 4 end

现在又有一个需求 就是 case then分了四个组排序 我想在想对这四个组 分别进行 login_time最后登录时间进行降序排序 应该怎么写呢? 是针对于每个组进行最后登录时间降序排序 不是全部

huanwuying 发表于 2022-5-27 16:27

要排序的都写到order里面,比如order by ** desc,** desc ,*** desc

ppgjx 发表于 2022-5-27 16:30

huanwuying 发表于 2022-5-27 16:27
要排序的都写到order里面,比如order by ** desc,** desc ,*** desc

这个没办法拍 这个条件

xinzdf110 发表于 2022-5-27 16:43

用union all把每个结构连起来

ppgjx 发表于 2022-5-27 16:43

马杏争1994 发表于 2022-5-27 16:34
select * from (
select a.*,
(case when (isauthor_auth = 1 and online = 0) then 0


好像执行不了

xinzdf110 发表于 2022-5-27 16:47

select * from   table   whereis   在线认证主播
unionall
select * from   table   whereis离线认证主播
unionall
select * from   table   whereis在线非认证主播
......

snwjas 发表于 2022-5-27 16:47

这个简单啊,只不过可能效率不咋地,索引打不上
order by case when isauthor_auth = 1 and online = 2 then 1
        when isauthor_auth = 1 and online = 0 then 2
        when isauthor_auth = 0 and online = 2 then 3
        when isauthor_auth = 0 and online = 0 then 4
        when isauthor_auth is null and online = 2 then 5
        when isauthor_auth is null and online = 0 then 6 end

xiaoyxf 发表于 2022-5-27 16:49

应该可以,拼接online和isauthor_auth的值,然后把排序条件按 online和isauthor_auth的值转义好,比如在线认证主播,就是31,   然后用拼接的值按转义的值去排序

ly765893958 发表于 2022-5-27 16:56

snwjas 发表于 2022-5-27 16:47
这个简单啊,只不过可能效率不咋地,索引打不上
order by case when isauthor_auth ...

楼上正解

1270698424 发表于 2022-5-27 17:00

本帖最后由 1270698424 于 2022-5-27 17:03 编辑

select * form user
order by(case when (online = '3' and isauthor_auth = '1') then 1
when (online = '0' and isauthor_auth = '1') then 2
when (online = '3' and isauthor_auth = '0') then 3
when (online = '0' and isauthor_auth = '0') then 4
when (online = '3' and isauthor_auth not in ('0','1')) then 5
when (online = '0' and isauthor_auth not in ('0','1')) then 6
else 7 end)
页: [1] 2
查看完整版本: sql case when分组后 如何针对每个组进行排序