首页
点滴
记录MySQL日常使用的一些小坑
#### 问题一:MySQL排序分页查询数据顺序错乱 mysql对无索引字段进行排序后limit ,当被排序字段有相同值时并且在limit范围内,取的值并不是正常排序后的值,有可能第一页查询的记录,重复出现在第二页的查询记录中,而且第二页的查询结果乱序,导致分页结果查询错乱问题。 #### 问题一的解决方案 ```sql 方法一【推荐使用】:order by 后多添加一个id字段排序 方法二:order by 的列中包含一个索引列(如果没有,则需要把这个列改为索引列) ``` #### 问题二:按某个字段分组后取每组中最新的一条记录 在日常开发中,经常会遇到需要按某个字段分组后取每组钟最新的一条,直接group by 分组是不行的。我们需要先排序再分组这样才可以,但是单单排序也不行,还需要用到 having 1 或者 limit 10000 才行,这个10000是跟据情况而定的,要比表中记录数大,不然取的数不准 比如:我们需要按type字段分组,然后取每一组中create_time最新的一条记录 ```sql 这种写法是不行了 SELECT * FROM ( SELECT * FROM t_blog ORDER BY create_time DESC ) GROUP BY type ``` #### 问题二的解决方案 ```sql 方法一【推荐使用】:加上 HAVING 1 即可 SELECT * FROM ( SELECT * FROM t_blog HAVING 1 ORDER BY create_time DESC ) GROUP BY type 方法二:加上 LIMIT 10000 只不过LIMIT后面跟的这个数需要足够大,不然也会有问题 SELECT * FROM ( SELECT * FROM t_blog ORDER BY create_time DESC LIMIT 10000 ) GROUP BY type ``` #### 问题三:Sql查询不区分大小写 一般情况下我们建表时字符集选 `utf8mb4`,排序规则选`utf8mb4_general_ci`。这种情况下mysql查询是不区分大小写的。比如`t_user`表里有2条数据`name`分别是 `aaa`和`AAA`。 sql语句`SELECT * FROM t_user WHERE name = 'aAa'` 查询结果会把2条数据都查出来 #### 问题三的解决方案 ``` 方法一:在查询中需要区分大小写的字段前加上 BINARY 关键字 SELECT * FROM t_user WHERE BINARY name = 'aAa' 方法二:表中该字段的排序规则不选utf8mb4_general_ci,而是选排序规则选utf8mb4_general_bin ``` ------------ ####持续更新......
博客分类
源码解析 (1)
多线程 (5)
Java (10)
Linux (8)
Docker (9)
SpringBoot (14)
微服务 (1)
Redis (15)
MySQL (7)
VMware (3)
Nginx (15)
MyBatis (2)
RabbitMQ (1)
Git (7)
工具类 (12)
前端 (3)
友情链接
layui
© 2020-2025 www.chenhuazhan.com All Rights Reserved 备案号:
桂ICP备17004487号-1
粤公网安备44030002005146