搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
从前慢现在也慢
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
分享5个自动生成PPT的网站
2
阿里数据总监分享《阿里数据中台建设实践案例》,PPT 语音讲解!
3
行业专家聊:jQuery还有意义吗?_jquery是不是多余的
4
Android系统的手机文件夹目录_查看安卓软件关联文件夹
5
Linux 下固态硬盘恢复误删除文件_fstab discard
6
PUTTY:如何使用PUTTY通过跳板机连接Mysql数据库_putty跳板机登录
7
训练yolov5时,RuntimeError: CUDA out of memory._yolov5 cuda out of memory
8
linux sleep()的实现原理
9
vue列表渲染出的ul表进行置顶和下移的操作_vue ul
10
三大排序:冒泡、选择、插入
当前位置:
article
> 正文
mysql REGEXP 正则的实现两个字符串组的匹配_mysql中regexp两个字段
作者:从前慢现在也慢 | 2024-03-13 22:32:40
赞
踩
mysql中regexp两个字段
最近MySQL版块中类似问题出现得比较多。总结了一下。
由于某些原因,有时候我们没有按照范式的设计准则而把一些属性放到同一个字符串字段中。比如个人兴趣,有时候我们设计表为
create table members (uid int primary key,uname varchar(20),hobby varchar(100));
表中内容如下
mysql> select * from members;
+-----+-------+---------------------------------+
| uid | uname | hobby |
+-----+-------+---------------------------------+
| 1 | AAAA | 音乐,电影,网络,篮球,阅读,乒乓球 |
| 2 | BBBB | 音乐,阅读,乒乓球,发呆,围棋,参禅 |
| 3 | CCCC | 交友,乒乓球 |
| 4 | DDDD | 台球,网络,看书,旅游 |
| 5 | EEEE | 音乐,发呆,下围棋,参禅 |
+-----+-------+---------------------------------+
4 rows in set (0.00 sec)
如果我们现在想查找一个与某个用户X (阅读,交友,围棋,足球,滑雪)有着相同爱好的会员记录 如果来操作呢?
在其它数据库中,我们能只通过程序来或者存储过程来分解这个 "阅读,交友,围棋,足球,滑雪" 字符串为单独的爱好项目,然后一个一个进行 like '%xxxx%' 来查询。 但在MySQL中我们可以直接利用这个regexp正规表达式 来构造SQL语句来实现。
首先我们把 '阅读,交友,围棋,足球,滑雪' 转换成为正则式 为 '阅读|交友|围棋|足球|滑雪' , | 在正则表达式中为 '或' 的意思
mysql> select replace('阅读,交友,围棋,足球,滑雪',',','|');
+---------------------------------------------+
| replace('阅读,交友,围棋,足球,滑雪',',','|') |
+---------------------------------------------+
| 阅读|交友|围棋|足球|滑雪 |
+---------------------------------------------+
1 row in set (0.00 sec)
这样我们可以用SQL语句如下。
mysql> select * from members where hobby regexp replace('阅读,交友,围棋,足球,滑雪',',','|');
+-----+-------+---------------------------------+
| uid | uname | hobby |
+-----+-------+---------------------------------+
| 1 | AAAA | 音乐,电影,网络,篮球,阅读,乒乓球 |
| 2 | BBBB | 音乐,阅读,乒乓球,发呆,围棋,参禅 |
| 3 | CCCC | 交友,乒乓球 |
| 5 | EEEE | 音乐,发呆,下围棋,参禅 |
+-----+-------+---------------------------------+
3 rows in set (0.00 sec)
如上语句我们可以通过一句SQL得到所有hobby包含 '阅读,交友,围棋,足球,滑雪' 任一项的记录。
但上述的语句中还有一点小的缺陷,那就是把 '下围棋' 这一条也选择了出来,如果精确匹配的话这条记录不应该被选中。为了避免这种情况,我们对SQL语句做如下改进。
把正则式改为 ',(阅读|交友|围棋|足球|滑雪),' 也就是要求匹配项前后必须有一个界定符","
mysql> select concat(',(',replace('阅读,交友,围棋,足球,滑雪',',','|'),'),');
+---------------------------------------------------------------+
| concat(',(',replace('阅读,交友,围棋,足球,滑雪',',','|'),'),') |
+---------------------------------------------------------------+
| ,(阅读|交友|围棋|足球|滑雪), |
+---------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select * from members
-> where concat(',',hobby,',') regexp
-> concat(',(',replace('阅读,交友,围棋,足球,滑雪',',','|'),'),');
+-----+-------+---------------------------------+
| uid | uname | hobby |
+-----+-------+---------------------------------+
| 1 | AAAA | 音乐,电影,网络,篮球,阅读,乒乓球 |
| 2 | BBBB | 音乐,阅读,乒乓球,发呆,围棋,参禅 |
| 3 | CCCC | 交友,乒乓球 |
+-----+-------+---------------------------------+
3 rows in set (0.00 sec)
这样避免了第5条记录被选中。
当然也可以利用这种正则式 ',阅读,|,交友,|,围棋,|,足球,|,滑雪,', 但效率显然不如 ',(阅读|交友|围棋|足球|滑雪),' 这种了。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/230932
推荐阅读
article
springBoot
配置
druid
多
数据源
MySQL+SQLSERVER_
druid
sqlse...
springBoot
配置
druid
多
数据源
_
druid
sqlserver
druid
sqlserver
...
赞
踩
article
mysql
join
left
join
_详解
Mysql
LEFT
JOIN
和
JOIN
查询
区别及原...
一、Join
查询
原理
查询
原理:MySQL内部采用了一种叫做 nested loop
join
(嵌套循环连接)的算法。Ne...
赞
踩
article
MySQL
查询语句中
join
的
分类与区别_
mysql
join
和
inner
join
mysql
j...
本文大致介绍了
MySQL
中常用
的
3种
join
_
mysql
join
和
inner
join
mysql
join
和
inne...
赞
踩
article
MySQL
left
join
、
right
join
和
join
的
区别_
mysql
left
join
...
首先有2张表一、
left
join
顾名思义,就是“左连接”,表1左连接表2,以左为主,表示以表1为主,关联上表2
的
数据,...
赞
踩
article
mysql
集中
join
的区别_
mysql
join
left
join
full
join
...
mysql
集中
join
的区别1、
join
等价于inner
join
内连接,是返回两个表中都有的符合条件集合。2、lef...
赞
踩
article
mysql
inner
join
和
join
_图解
MySQL
的各种
JOIN
,看完
不
懂来找我!...
点击上方关注,选择设为星标每天早上8点半,优质文章
不
见
不
散~从业以来主要在做客户端,用到的数据库都是表结构比较简单的 S...
赞
踩
article
MySQL
8.
x
安装后
Navicat
无法
连接
的
解决方案
...
文章目录一、问题描述二、问题分析三、
解决方案
一、问题描述 在安装了
MySQL
8.
x
的
版本后,修改了 root
的
...
赞
踩
article
mysql
:
mysql
的
优势_
mysql
优势...
7)安全性和连接性十分灵活和安全
的
权限和密码系统,允许基于主机
的
验证。由于MySQL是网络化
的
,因此可以在因特网上
的
任何...
赞
踩
article
MySQL
是什么
,
如何整合
SpringBoot
,
以及
使用
优势_
springboot
mysql
...
MySQL
是什么
,
如何整合
SpringBoot
,
以及
使用
优势_
springboot
mysql
springboot
my...
赞
踩
article
【
MySQL
】三大日志-
bin
log
、
redo
log
和
undo
log
_
undo
log
什么时候写入...
日志是mysql数据库的重要组成部分,记录着数据库运行期间各种状态信息。mysql日志主要包括错误日志、查询日志、慢查询...
赞
踩
article
[
mysql
]
binlog
和
redolog
有
什么
区别
?
_
mysql
binlog
redolog
区...
前言可能会考的面试题,我都把
redolog
原理看一遍了。那么,这个问题怎么回答呢?回答1.redo log 是innod...
赞
踩
article
MySQL
日志:
undo
log
、
redo
log
、
bin
log
有什么用?_
bin
log
开启的意...
1.
redo
log
是InnoDB存储引擎的一种日志,主要作用是崩溃恢复,有三种刷盘策略,有innodb_flush_l...
赞
踩
article
mysql
中的
bin
log
、
redo
log
和
undo
log
_
mysql
日志
:
undo
log
...
bin
log
用于记录数据库执行的写入性操作(不包括查询)信息,以二进制的形式保存在磁盘中。
bin
log
是
mysql
的逻辑...
赞
踩
article
【
MySQL
】:
DQL
查询
...
DQL
(Data Query Language)是SQL中的一种重要语言类型,用于
查询
数据库中表的记录。在日常业务系统中...
赞
踩
article
【
MySQL
】
MySQL
的三种
log
——
bin
log
、
redo
log
、
undo
log
(一文带你彻...
bin
log
其实在日常的开发中听得很多的,因为很多时候数据的更新就依赖着
bin
log
。举个简单的例子:我们的数据是保存在...
赞
踩
article
MySQL
——
redo
log
与 bin
log
_
redo
log
镜像...
一、重做日志(
redo
log
)InnoDB 存储引擎会使用重做日志文件恢复到掉电前的时刻,以此来保证数据的完整性。采用...
赞
踩
article
MySQL 日志:
undo
log
、
redo
log
、
bin
log
...
大家好,我是田哥今天来和大家分享MySQL的三个日志文件,可以说 MySQL 的多数特性都是围绕日志文件实现,而其中最重...
赞
踩
article
MySQL 的 binglog、
redolog
、
undolog
_
mysql
binlog
redol...
我们在每个修改的地方都记录一条对应的 redo 日志显然是不现实的,因此实现方式是用时间换空间,我们在数据库崩了之后用日...
赞
踩
article
MySQL
的日志(
undo
log
、
redo
log
、
bin
log
)_
mysql
每次修改操作都会写...
WAL(Write Ahead Log)预写日志,指的是
MySQL
的写操作并不是立刻更新到磁盘上,而是先记录在日志上...
赞
踩
article
基于
java
web+
jsp
的
旅游景点
门票
管理系统
(
java
+SSM+
jsp
+Mysql)_eclip...
基于
java
web+
jsp
的
旅游景点
门票
管理系统
(
java
+SSM+
jsp
+Mysql)
jsp
+ssm(spring+s...
赞
踩
相关标签
spring boot
mysql
sqlserver
mysql join left join
数据库
mysql inner join 和join
当前记录集不支持更新
sql
java
database
面试