mysql null排序

对null值排序


select * from t1 order by sname desc;

+-----+-----+--------+
| sid | sno | sname |
+-----+-----+--------+
| 103 | 203 | 徐文宇 |
| 104 | 204 | kk |
| 101 | 201 | NULL |
| 103 | 203 | NULL |
+-----+-----+--------+

select * from t1 order by if(sname is null,0,1),sname desc;

+-----+-----+--------+
| sid | sno | sname |
+-----+-----+--------+
| 101 | 201 | NULL |
| 103 | 203 | NULL |
| 103 | 203 | 徐文宇 |
| 104 | 204 | kk |

MySQL 中,实现分组排序有多种方法,不同版本的 MySQL 适用的方法有所不同: ### MySQL 8.0+ 版本 可直接使用 `row_number()` 函数,示例代码如下: ```sql SELECT * FROM ( SELECT *, row_number() over ( PARTITION BY group_name ORDER BY score DESC ) AS rn FROM `test` ) t WHERE t.rn <= 2; ``` 上述代码通过 `row_number()` 函数,对 `test` 表按照 `group_name` 进行分组,在每个分组内根据 `score` 降序排序,并且为每个分组内的记录生成一个行号 `rn`,最后筛选出 `rn` 小于等于 2 的记录 [^5]。 ### MySQL 5.7 及以下版本 - **分组普通排名(相同的值也是不同的排名)** ```sql SELECT a.sid,a.name,a.subject,a.score,a.rank FROM ( SELECT m.*, IF(@p=subject,@r:=@r + 1,@r:=1) AS rank, @p:=subject FROM mian62 m, (SELECT @p:=0,@r:=0) r ORDER BY subject,score DESC ) a; ``` 此代码对 `mian62` 表按照 `subject` 分组,在每个分组内根据 `score` 降序排序,通过用户变量 `@p` 和 `@r` 实现普通排名,相同 `subject` 下的记录从 1 开始依次排名 [^1]。 - **另一种分组后排序方式** ```sql SELECT NAME, @rk:=IF(@score=score,@rk,@rk + 1) dense_r, @score:=score score FROM ( SELECT NAME,score FROM students ORDER BY score DESC ) a, (SELECT @rk:=0,@score:=NULL) b; ``` 上述代码从 `students` 表中查询 `NAME` 和 `score` 字段,按照 `score` 降序排序,然后通过用户变量 `@rk` 和 `@score` 为排序后的记录生成排名 [^3]。 - **查询各个分类的访问量的排名** ```sql SELECT A.*, @last :=IF(@FIRST = A.CATEGORY_ID, @last + 1, 1 ) AS rn, @FIRST := A.CATEGORY_ID FROM POSTS A, (SELECT @last := 0, @FIRST := NULL ) B ORDER BY A.CATEGORY_ID,VIEW_COUNT DESC; ``` 该代码对 `POSTS` 表按照 `CATEGORY_ID` 进行分组,在每个分组内根据 `VIEW_COUNT` 降序排序,使用用户变量 `@last` 和 `@FIRST` 为每个分组内的记录生成排名 [^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值