最近MySQL版块中类似问题出现得比较多。总结了一下。 由于某些原因,有时候我们没有按照范式的设计准则而把一些属性放到同一个字符串字段中。比如个人兴趣,有时候我......
最近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('阅读,交友,围棋,足球,滑雪',',','|'); ----- ------- ---------------------------------
1/3 1 2 3 下一页 尾页 |