分页 + 模糊查询 有坑

bootstrapTable分页、模糊查询、数据刷新、页面跳转。。。各种坑 首先准备好用到的js和css bootstrap下载地址:http://www.bootcss.com/ bootstrap table插件下载地址 官网:https://bootstrap-table.com/ Github:https://github.com/wenzhixin/bootstrap-table 主要css和js bootstrap-table.css、jquery.... 阅读详情

前言

不知道你有没有使用过Mysql的like语句,进行模糊查询?

不知道你有没有将查询结果,进行分页处理?

模糊查询,加上分页处理,会有意想不到的坑,不信我们继续往下看。

我之前提供过一个品牌查询接口,给前端品牌选择控件使用的。

当时为了性能考虑,怕前端控件因为一次性加载太多的品牌,而导致页面卡死。

因此,对品牌查询接口做了分页处理。

刚开始品牌表的数据比较少,没有出现什么问题。

后来,产品加需求了,在品牌下拉选择控件中,让用户可以输入自定义品牌。

在用户添加品牌前,需要先查一下,如果该品牌存在,则使用已有品牌。如果不存在,则新增品牌。(这里是精确匹配)

这个需求很简单,很容易实现了。

后来,产品又加需求了,需要按名称模糊查询品牌。

该功能上线后,使用了很长一段时间,也没啥问题。

突然,在不经意的某一天,这个功能却出问题了。

到底怎么回事呢?

1.案发现场

某一天下午,运营找到测试反馈一个问题说:明明品牌苏三,已经存在了,但用户输入关键字:苏三时,系统没有让用户直接选择已有品牌,而是添加了一个叫:苏三的自定义的品牌。

我过去一看,还真的有问题。

不一会儿,就定位到原因了,初步判断是分页的问题。

搜索关键字:苏三,竟然出现了好几页的数据,把我惊呆了,品牌表怎么多了这么多数据了。

我查了数据库,其实数据量并不是特别多,但有些品牌名称比较特殊,有些品牌名称是多个品牌名称拼接而成的,比如:苏三,李四 或者 苏三,李四,王五,这是一个品牌。

其实是品牌名称建的不规范导致的问题,但已经没法让运营修改品牌了,只能通过技术手段解决目前的问题。

查询第一页的数据sql:

select * from brand where name like '%苏三%' 
order by edit_date desc limit 5;
复制代码

执行结果:

我们可以看到,图中并没有等于苏三这两个字的数据。

注意:为了好演示,这里给的每页大小是5,真实的场景并非如此。

查询第二页的数据sql:

select * from brand where name like '%苏三%' 
order by edit_date desc limit 5,5;
复制代码

执行结果:

从图中看到,在第二行,出现了正好等于苏三这两个字的数据。

用户搜索关键字:苏三 时,前端页面在调用品牌查询接口,pageNo默认是1。由于能够匹配关键字的数据太多了,第一页返回不完,需要多页才能全部返回。

前端获取到第一页的数据后,跟关键字:苏三 做比较,发现没有等于苏三的品牌。

这样就会在下拉控件中,自动添加一个品牌:苏三,同时在右边增加自定义标签。

这样就出问题了,明明苏三这个品牌是有的,但用户还能自定义一个苏三,而不是直接选择。

2.思考123

苏三这个关键字,通过模糊查询可以查询出来,但由于品牌接口做了分页,全匹配的品牌:苏三,出现在第二页了,才导致问题的产生。

如果要解决这个问题,让它出现在第一页不就OK了?

这时候,就有下面几种解决方案。

2.1 方案1

分页查询品牌接口,pageSize是5。

我们为什么不把pageSize调大一点?比如改成:200、500等。

这样通过苏三关键字,进行模糊查询的时候,结果基本都在第一页。

这样就能非常快速的解决问题。

但有个缺点就是:如果这次调大了pageSize,但后面查询关键字的品牌又出现在第二页怎么办?

不可能一直改pageSize吧?

2.2 方案2

把分页查询接口的数据,拆分成两部分:

  1. 精确查询
  2. 模糊查询

在代码中做处理的时候,先根据关键字精确查询,即sql中使用name='苏三',这种方式查询一次数据。

如果没查出数据,则再直接用like '%苏三'进行模糊查询。

如果查出了一条数据,则把它放在返回结果集合中的第一位置。接下来,使用like '%苏三'进行模糊查询的时候,再加上条件 name <> '苏三'。将查出的结果,从第二个位置往后放。

这样可以拼接出你想要的集合。

但有个缺点,就是代码耦合性太大了。

2.3 方案3

之前,品牌苏三在第二页,最根本的原因是使用了edit_time字段进行逆序的。

也就是说,修改时间越大的越排在前面,而品牌苏三的修改时间很小,所以排在第二页了。

如果想品牌苏三,排在第一页,修改一下排序规则,不就搞定了?

可以改成按:id或者name字段排序。

用id字段排序,不太合适,虽说用了雪花算法,但跟修改时间类似,先插入的数据,会越小。

select * from brand where name like '%苏三%' 
order by id desc limit 5;
复制代码

用它排序的结果,跟使用修改时间排序差不了太多。

看来,只能使用name字段排序了。

3.如何排序?

我们在sql中直接对name字段,进行升序或者降序吗?

显然不是。

使用name字段降序:

select * from brand where name like '%苏三%' 
order by name desc limit 5;
复制代码

执行结果:

图中并没有看到我们想要的数据。

其实,使用name字段升序,也可能在第一页查不出我们所想要的数据。

到底该如何处理呢?

假如,我们有这样一种排序:

  1. 全匹配显示在最前面,比如:苏三。
  2. 数据左半部分匹配,右边按字母排序,比如:苏三1、苏三2、苏三说技术。
  3. 从中间开始匹配,比如:1苏三、2苏三。
  4. 第2步和第3步,还要根据字符长度排序,字符短的排在前面,比如:1苏三、1苏三1、苏三说技术。

如果我们能实现上面的这种排序方式,这个问题就能完美解决了。

说起来容易,做起来难。

难道要先全匹配:name='苏三',再有匹配:name like '苏三%',再左匹配:name like '%苏三',把查询三次的结果组装起来?

显然这种做法有点low。

要实现上面我们设想的排序方式,在es中更好处理一下,但在mysql中要怎么处理呢?

4.解决方案

其实,我们可以换一种思路,根据字符的长度排序。

mysql给我们提供了很多非常有用的函数,比如:char_length。

通过该函数就能获取字符长度。

sql调整如下:

select * from brand where name like '%苏三%' 
order by char_length(name) asc limit 5;
复制代码

name字段使用关键字模糊查询之后,再使用char_length函数,获取name字段的字符长度,然后按长度升序。

仅这一个骚操作,就搞定需求了:

我们所期待的:苏三,终于排在第一个了。同时由于该sql做了分页的,即使name字段在查询时丢失了索引,执行效率也不会太低。

业务上的需求搞定了。

但追求完美的我们,好奇,想看看第二页是什么情况:

select * from brand where name like '%苏三%' 
order by char_length(name) asc limit 5,5;
复制代码

执行结果:

并没有按照我们设想的剧本进行下去,我们之前假设的3条排序中,第2条和第3条都没有满足。

这时该怎么办?

答:可以使用mysql中的locate函数,通过它可以匹配的关键字,在字符串中的位置。

使用locate函数改造之后sql如下:

select * from brand where name like '%苏三%' 
order by char_length(name) asc, locate('苏三',name) asc limit 5,5;
复制代码

执行结果:

完美,终于出现我们想要的结果了。

除此之外,还可以使用:instr和position函数,它们的功能跟locate函数类似,在这里我就不一一介绍了,感兴趣的小伙伴可以找我私聊。

5. 总结

其实,模糊查询和分页,如果分开用,一般是没问题的。

但如果它们要一起使用,一定要考虑排序问题。

如果只是按照简单的时间或者id排序,有些特殊的业务场景,没办法满足,很容易出现bug。

当然解决上面问题,还有其他办法,比如:pageSize调大一点,或者把全匹配放到第一页。

但更优的方案,是通过mysql的函数来解决问题。

我们可以通过mysql提供的:char_length、locate、instr和position函数等,来实现很多复杂的排序功能。

最后说一句(求关注,别白嫖我)

 

如果这篇文章对您有所帮助,或者有所启发的话,帮忙扫描下发二维码关注一下,您的支持是我坚持写作最大的动力。

分页查询 & 条件分页查询 &动态sql语句 本文介绍了使用SpringBoot+MyBatis+PageHelper实现分页查询的最佳实践。主要内容包括:1)基础分页查询实现,通过PageHelper.startPage()自动处理分页;2)带条件的动态分页查询,结合MyBatis动态SQL;3)PageInfo对象封装分页信息;4)常见避坑指南,如PageHelper必须紧跟查询语句等。文章提供了可直接复用的完整代码示例,适用于员工/部门管理等常见业务场景,是SpringBoot项目中实现分页查询的高效解决方案。 阅读详情

相关推荐

MongoDB模糊查询优化与实战技巧

数据库查询中的模糊匹配是处理非精确搜索需求的基础技术,其核心原理是通过模式匹配算法在数据集中定位符合特定模式的记录。在NoSQL领域,MongoDB提供了多种实现模糊查询的技术方案,包括正则表达式、文本索引和通配符索引等,这些方案在搜索效率、资源占用和功能丰富度上各有特点。从技术价值看,合理的模糊查询方案能显著提升用户体验并降低系统负载,特别是在用户管理系统、电商搜索和日志分析等需要处理半结构化数据的场景中。本文以MongoDB为例,详细解析了如何通过正则表达式实现基础模糊匹配,以及如何利用文本索引和通配符

weixin_32642109的博客 298

模糊查询后的分页实现

模糊查询结果的分页实现,包括前端页面和后端Servlet的实现

qq_50531134的博客 1028

Access模糊查询窗体实战:从SQL LIKE到VBA动态构建多条件搜索

在数据库应用开发中,模糊查询是提升数据检索灵活性的关键技术,它基于SQL的LIKE运算符和通配符实现部分匹配,解决了用户记不清完整关键词时的搜索难题。这项技术的核心价值在于将生硬的精确匹配转化为智能的意图理解,极大地改善了用户体验。在桌面数据库管理场景下,通过VBA动态构建查询字符串,可以灵活组合多个条件,并平衡查询性能与准确性。本文以Microsoft Access窗体开发为例,深入探讨了如何利用VBA代码、窗体事件和SQL拼接,构建一个支持多条件组合、实时反馈的模糊查询系统,并分享了处理单引号转义、空值

weixin_33508411的博客 275

mysql 模糊查询导致索引失效如何优化

可以优化查询语句,使用 `LIKE` 时,不要在模糊查询的开头就使用通配符 `%`,因为这样查询会强制进行全表扫描,查询效率会大大降低。当查询表中的数据时,应尽量避免使用 `SELECT *`,因为这样会返回表中所有字段的数据,包括不需要的数据,导致查询效率降低。当使用模糊查询时,MySQL 的普通索引是无法生效的,因为模糊查询需要进行类似于全表扫描的操作,这会导致查询效率变得很低。总之,在使用模糊查询时,应该尽量避免全表扫描,优化查询语句和表结构,使用合适的索引等手段,来提高查询效率和数据库性能。

qq_27487739的博客 2095

SSM实现分页模糊查询

SSM实现分页模糊查询 一、准备工作 1、pom.xml <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <ver...

xfj_csdn的博客 2671

模糊查询 + 分页 有坑!

不知道你有没有使用过Mysql的like语句,进行模糊查询?不知道你有没有将查询结果,进行分页处理?模糊查询,加上分页处理,会有意想不到的坑,不信我们继续往下看。我之前提供过一个品牌查询接口,给前端品牌选择控件使用的。当时为了性能考虑,怕前端控件因为一次性加载太多的品牌,而导致页面卡死。因此,对品牌查询接口做了分页处理。刚开始品牌表的数据比较少,没有出现什么问题。后来,产品加需求了,在品牌下拉选择控件中,让用户可以输入自定义品牌。

1954

mysql模糊查询后分页_mysql笔记十——数据库分页技术(再分页,模糊查询)

1.什么是数据分页:数据分页就是将很多条记录像书本一样分页,每页显示多少行记录;2.为什么要数据分页:当我们进行sql语句查询时,假如数据有成千上万行记录,如果在同一个页面去显示,那这个页面得有多大,数据就要很多,而我们所需的记录又很少,不使用分页,查看起来那么繁琐,而且一不小心容易看着眼花。使用数据分页,就行书本一样,有页数,一目了然。相当简洁。3.核心sql语句:SELECT * FROM s...

weixin_42401025的博客 659

SpringBoot与锐浪报表服务器深度整合实战指南

本文详细介绍了SpringBoot与锐浪报表服务器的深度整合实战指南,包括环境准备、Windows/Linux系统配置、核心功能实现代码解析及常见问题解决方案。通过具体案例和代码示例,帮助开发者高效完成报表系统的集成与部署,提升企业级应用的报表处理能力。

weixin_29238147的博客 370

mysql带模糊查询的分页_mybatis 全查 分页 模糊查询一体

配置xml文件SELECT NOTICE_ID,NOTICE_TITLE,TYPE,DATETIME FROM pt_noticetype like #{fType}AND NOTICE_TITLE like #{noticeTitlef}limit #{startIndex},#{pageSize}select count(*)from pt_noticetype like #{fType}AN...

weixin_29699041的博客 506

52页PPT智慧矿山数字化工业大数据平台建设方案

致力于为煤炭企业构建“全”、“统”、“通”、”智”的(大数据平台/数据中台)体系,基于“数字新基建”时代的数据价值思考,构建全域数字化矿区共享能力中心,助力煤炭企业实现数字化转型,打通底层系统之间数据壁垒,加强公司整体管理和安全生产系数,为运营提供数据统筹模型,实现重点数据实时监控和数据共享开放服务。综上所述,智慧矿山数据治理是一个系统性的工程,需要煤炭企业内各部门连同行业和政府监管部门通力协作,制定数据标准和管理规范,重塑煤炭企业数据架构和数据传输链路,打通智慧矿山数据壁垒,保障数据质量和数据安全。

zuoan1993的博客 1055

Agentic RAG:RAG从静态到具有理解、推理、决策的Agentic RAG

RAG技术演进:从静态检索到智能代理 RAG(检索增强生成)技术经历了五个关键发展阶段:基础RAG(关键词检索)、高级RAG(语义理解)、模块化RAG(灵活架构)、图RAG(知识图谱)和最新的Agentic RAG(智能代理)。Agentic RAG通过引入自主AI代理,具备反思、规划、工具使用和多代理协作能力,实现了动态决策和自适应工作流。相比传统RAG的静态检索流程,Agentic RAG能处理复杂多步推理任务,通过自我改进机制提高输出质量,并支持多专业代理协作,显著提升了RAG系统在复杂场景下的表现。

2538

JavaWeb12(实现基础分页&模糊查询的分页)

@param pageSize 每页多少条数据。* @param pageIndex 设置第几页。//说明点了"首页"/"上一页"/"下一页"/"末页"* @param str 表名等。* @param pageSize 每页多少条数据。*当pageIndex=3:11-15。*@param tabName 表名等。*如果每页3条即pageSize=3。*当pageIndex=2:6-10。--因此需要将伪列----->名列。*当pageIndex=1:1-3。*当pageIndex=2:4-6。

qq_73126462的博客 2020

IB网络下不同租户业务隔离方案

IB(InfiniBand)网络隔离可以在不同的通信模式下实现,其中包括 IPoIB(IP over InfiniBand)通信模式。在 IPoIB 模式下,InfiniBand 网络可以承载 IP 数据包,使得基于 IP 的应用程序能够在 InfiniBand 网络上进行通信。在这种情况下,IB 网络隔离通常指通过配置 Partition Key(PKey)来实现不同的租户或应用程序之间的网络隔离。然而,IB 网络隔离并不仅限于 IPoIB 模式。

guganly的专栏 1527

分页 + 模糊查询 有坑!

不知道你有没有使用过Mysql的like语句,进行模糊查询?不知道你有没有将查询结果,进行分页处理?模糊查询,加上分页处理,会有意想不到的坑,不信我们继续往下看。我之前提供过一个品牌查询接口,给前端品牌选择控件使用的。当时为了性能考虑,怕前端控件因为一次性加载太多的品牌,而导致页面卡死。因此,对品牌查询接口做了分页处理。刚开始品牌表的数据比较少,没有出现什么问题。后来,产品加需求了,在品牌下拉选择控件中,让用户可以输入自定义品牌。

HelloWorld搬运工 1130

CMOS锁相环核心:四种鉴频鉴相器(PFD)结构深度剖析与选型指南

本文深入剖析了CMOS锁相环中四种鉴频鉴相器(PFD)的结构与性能,包括传统RS触发器型、非时钟型、预充电型和边沿触发型PFD。通过详细的电路分析、实测数据和工程案例,提供了PFD选型的实用指南,帮助工程师根据速度、功耗和精度需求选择最优方案,提升锁相环设计效率。

weixin_42530458的博客 587

零代码进行单细胞数据全流程分析教程

我开发的本地电脑无限使用无限分析作图的生信零代码一键分析电脑软件神器OmicsTools 软件在github上的zihaoxingstudy1/OmicsTools仓库 中,大家可以下载安装OmicsTools进行各种生信分析和可视化作图。

qq_40073899的博客 3625

分页 + 模糊查询竟然有坑?

不知道你有没有使用过Mysql的like语句,进行模糊查询?不知道你有没有将查询结果,进行分页处理?模糊查询,加上分页处理,会有意想不到的坑,不信我们继续往下看。我之前提供过一个品牌查询接口,给前端品牌选择控件使用的。当时为了性能考虑,怕前端控件因为一次性加载太多的品牌,而导致页面卡死。因此,对品牌查询接口做了分页处理。刚开始品牌表的数据比较少,没有出现什么问题。后来,产品加需求了,在品牌下拉选择...

磊哥聊Java 421

YOLOv11改进 | 添加注意力篇 | 一文带你改进GAM、CBAM、CA、ECA等通道注意力机制和多头注意力机制

这篇文章给大家带来的改进机制是一个汇总篇,包含一些简单的注意力机制,本来一直不想发这些内容的(网上教程太多了,发出来增加文章数量也没什么意义),但是群内的读者很多都问我这些机制所以单独出一期视频来汇总一些比较简单的注意力机制添加的方法和使用教程,本文的内容不会过度的去解释原理,更多的是从从代码的使用上和实用的角度出发去写这篇教程。欢迎大家订阅我的专栏一起学习YOLO!YOLOv11改进系列专栏——本专栏持续复习各种顶会内容——科研必备目录一、本文介绍二、GAM2.1 GAM的介绍2.2 GAM的核心代码。

Snu77的博客 5153

笔记:mybatis模糊查询简单拼接,分页插件,以及自己栽在${}和 #{}的坑

1.模糊查询 基础打的不牢靠,用的时候就是各种错; 在springmvc用到模糊查询的时候,编写xml的mapper映射文件就出错了; 例如: 查询名字里带有张字的用户;很简单的一条sql; select * from THEUSER where userName like '%张%'; 写在xml里面:这不是唯一方法,只是我感觉自己用起来简单,容易记住的方法 使用bind标签联合拼接sql; ...

qq_42583216的博客 347

异构图中的注意力机制网络:节点级别和语义级别的注意力(Python实现)

在本文中,我们介绍了如何使用Python实现异构图中的节点级别注意力和语义级别注意力。通过语义级别注意力,我们可以根据节点的语义信息对节点进行加权聚合。在本文中,我们将介绍如何使用Python实现异构图中的注意力机制网络,包括节点级别的注意力和语义级别的注意力。最后,我们使用注意力权重对节点特征进行加权聚合,得到聚合后的节点表示。然后,将聚合后的节点表示传递给语义级别注意力模型,根据节点的语义信息进行加权聚合,得到最终的表示。函数中,首先使用节点级别注意力模型对节点特征进行聚合,得到聚合后的节点表示。

HackNebulaZ的博客 485

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

MyBatis 动态分页 + 条件组合查询:基于反射实现通用分页封装

JDK1.8、SSM(Spring5 + MyBatis3.4.5)、MySQL5.7、IDEA 在做 SSM 后台管理系统时,分页 + 多条件组合模糊查询是高频需求。手写通用Page<T>分页对象,利用Java 反射封装BaseServiceImpl通用分页方法,所有业务模块直接复用,不需要每个业务重复编写分页逻辑。

2301_81541593的博客 230

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

mybatis知识整理

mybatis知识整理 1、mybatis的xml文件中 的大于小于 不能 直接使用 > < 符号来比较大小 应该是 &gt; 或者 &lt; 2、Mybatis基础知识,更新语句updateSelective和单纯的update语句区别,前者是根据选中要更新的字段进行更新,如果有空的字段,则会保留原有字段值,不会全部更新。后者则是全部更新字段,有空值则字段值为空。 3、mybatis的Mapper.xml案例,下面这个案例不要照抄,有问题,模糊查询的时候 用了 OR

宁不知的博客 421

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Sequelize使用findAndCountAll()进行分页查询+模糊查询+联表查询的注意事项

【摘要】本文探讨了Sequelize在分页+模糊+联表查询时的问题及解决方案。针对两个关联模型(Article和Category),作者发现使用findAndCountAll时会出现SQL报错(无法识别关联表)和统计错误。通过禁用子查询(subQuery:false)解决关联问题,并改用findAll+count组合替代findAndCountAll来正确获取分页数据。文中详细说明了条件构建方法,包括模糊查询处理(使用Op.like)和分组计数(通过fn+col计算关联文章数),最终实现了带分类文章数量的安

weixin_68222693的博客 431

ssm分页+模糊查询

继上一篇博客ssm登录+增删改+列表展示数据后,笔者在此文将进行ssm的数据分页以及模糊查询功能。 1.建立页面实体类 在bean包下建立PageInfo类,此类存放关于分页展示数据时关于页面的各种相关参数,如页面中的数据记录List,单个页面数据记录条数上限size,页面总数totalPage,模糊查询时查询到的记录总数totalCount,当前页面位置currentPage, 代码如下: public class PageInfo<T> { private List<T>

lcscy的博客 2905

Redis模糊查询以及分页

今天在进行项目的时候需要Redis实现一个功能 需求:Redis hash类型模糊查询,同时对结果进行分页 首先是Redis hash类型模糊查询 //Cusor中存储的是查询key对应的Map Cursor<Map.Entry<String,String>> cursor = redisTemplate .opsForHash() .scan("zhDicGoods", ScanOptions.scanOptions() //绑定模糊查询的hash的ke

m0_46506160的博客 6011
上一篇: 5 分钟完成 ZooKeeper 数据迁移
下一篇: Redis集群模式通信成本影响因素
程序员职业指南
博客等级 码龄4年 2136粉丝 960原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值