Mysql 正则获取字段的交集【转】
问题描述
比如table1中有两条记录 
name no 
a    2,9 
b    8,10
然后有一串字符串,是0,1,2,3,4
然后通过一条sql,找出no为2,9的记录来```
因为字符串中有2,数据中也有2
详细解释 
------------------------------ 
表的字段就是 
name  no     
a     2,9    
b     8,10   
字符串是str="0,1,2,3,4" 
接下来就是查 no字段里跟str里有交集的记录 
查询的结果就是name=a的,no=2,9的 
------------------------------
答案是:
- select * from table1 where concat(',',no,',') regexp concat(',0,|,1,|,2,|,3,|,4,');
 
或者:
- select * from table1 where concat(',',no,',') regexp concat(',(',replace('0,1,2,3,4',',','|'),'),');
 
下面是扩展学习:
由于某些原因,有时候我们没有按照范式的设计准则而把一些属性放到同一个字符串字段中。比如个人兴趣,有时候我们设计表为 
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条记录被选中。
当然也可以利用这种正则式 ',阅读,|,交友,|,围棋,|,足球,|,滑雪,', 但效率显然不如 ',(阅读|交友|围棋|足球|滑雪),' 这种了。
转载:http://www.cnblogs.com/whoamme/p/4252306.html
正则匹配
mysql> select '123|124|125' regexp '123|126';
+--------------------------------+
| '123|124|125' regexp '123|126' |
+--------------------------------+
| |
+--------------------------------+
row in set (0.00 sec) mysql> select '122|124|125' regexp '123|126';
+--------------------------------+
| '122|124|125' regexp '123|126' |
+--------------------------------+
| |
+--------------------------------+
row in set (0.00 sec) mysql>
转载:http://bbs.csdn.net/topics/390683163
Mysql 正则获取字段的交集【转】的更多相关文章
- MySQL 表与字段编码格式报错
		
MySQL 表与字段编码格式报错 一.数据库,表,字段编码格式都为latin1(iso-8859-1) .当数据保存到数据库后,中文显示乱码. 解决办法: 1.在访问数据库连接串中添加编码格式: &l ...
 - kettle不能正常自动获取字段
		
Unable to close prepared statement after determining SQL layoutYou have an error in your SQL syntax ...
 - mysql正则查询 模糊查询
		
-- ==============正则查询================ /* SQL默认是忽略大小写的 正则模式使用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们 ...
 - JDBC读写MySQL的大字段数据
		
JDBC读写MySQL的大字段数据 不管你是新手还是老手,大字段数据的操作常常令你感到很头痛.因为大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式 来处理的.而非一般的字段 ...
 - mysql update获取主键
		
mysql update获取主键<pre>SET @update_id := 0;UPDATE mobantestinfo1 SET info2 = 'value', id = (SELE ...
 - 【Java/JDBC】利用ResultSetMetaData从数据库的某表中获取字段信息并存到csv文件
		
代码下载:https://files.cnblogs.com/files/xiandedanteng/FindNotnullColumns20191102-2.rar 这篇还不够完善,请看更完善的续篇 ...
 - MySQL中获取天、周、月等数据
		
MySQL中获取天.周.月等数据 1.今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 2.昨天 SELECT * FROM 表名 ...
 - MySQL 对 IP 字段的排序问题
		
MySQL 对 IP 字段的排序问题 问题描述 想对一张带有 IP 字段的表,对 IP 字段进行升序排序,方便查看每个段的 IP 信息. 表结构和表数据如下: SET NAMES utf8mb4; ; ...
 - mybatis&plus系列------Mysql的JSON字段的读取和转换
		
mybatis&plus系列------Mysql的JSON字段的读取和转换 一. 背景 在平常的开发中,我们可能会有这样的需求: 业务数据在存储的时候,并不是以mysql中的varchar丶 ...
 
随机推荐
- solr查询字段为空值,删除字段空值的方法
			
1. 例,我想查找内容字段content为空值的文档,看看文档有多少?执行如下查询. http://127.0.0.1:11100/solr/province/select?q=-(content:* ...
 - C#之面向对象初步
			
1.构造函数定义一个类时,C#默认会实现一个隐式的构造函数,默认的构造函数不接受参数,负责把新对象分配到内存中并确保所有字段数据都设置为正确的默认值.然而,一旦自定义了构造函数,默认构造函数就被自动从 ...
 - 最近在用placeholder ,是已有的,网上也有不少都是jq写的
			
其实除了支持placeholder 的浏览器,其他用js 或jq实现的都不叫placeholder 效果,只能算上是获取焦点,或失去焦点时的一个placeholder 没有出生时就已经存在效果 很多人 ...
 - 【Android 界面效果15】Android UI 之一步步教你自定义控件(自定义属性、合理设计onMeasure、合理设计onDraw等)
			
Android开发做到了一定程度,多少都会用到自定义控件,一方面是更加灵活,另一方面在大数据量的情况下自定义控件的效率比写布局文件更高. 一个相对完善的自定义控件在布局文件中和java ...
 - sql over开窗函数
			
1.使用over子句与rows_number()以及聚合函数进行使用,可以进行编号以及各种操作.而且利用over子句的分组效率比group by子句的效率更高. 2.在订单表(order)中统计中,生 ...
 - error和exception的区别,RuntimeException和非RuntimeException的区别
			
error和exception的区别,RuntimeException和非RuntimeException的区别 1. 异常机制 异常机制是指当程序出现错误后,程序如何处理.具体来说, ...
 - [Android]天气App 1
			
闲赋在家,无事可做就想着做点东西,于是乎把玩手机,我最常用的就是看天气,基本上我每天起来第一件事就是看天气,哈哈,用别人的这么爽,为什么不自己整一个关于天气的应用呢,墨迹天气.小米系统自带的天气.ya ...
 - HTML页面背景音乐控制
			
//兼容ie,chrome,safari. <object id="AudioID" type="application/x-mplayer2" data ...
 - 十个顶级的C语言资源助你成为优秀的程序员
			
译者言:学习C语言,需要一点一滴,沉下心来,找个安静的地方,泡上一杯咖啡,在浓郁的香味中一起品味她.(by Boatman Yang) 人们通常认为计算机编程很烦,但是有些人却从中发现了乐趣.每一个程 ...
 - Apache2.4 与 PHP 5.5 64位版的安装配置
			
我的环境:windows7 旗舰版 64位 首先下载相关文件: php 5.5.0 windows 64版 http://windows.php.net/download/#php-5.5 (选择 6 ...