原始需求:数据库中存储了很多微信名称然后得进行模糊查询。
Q1:为什么不进行一对多的设计,可以采用一对多的设计?
A:有时候仅仅为了一个属性进行建立一张表,会将表的数量变多,在插入和查询时候进行大量的操作。
数据库demo设计:
CREATE TABLE `WeNickName` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`weNickName` varchar(11) DEFAULT NULL COMMENT '微信名',
`other` int(11) DEFAULT NULL COMMENT '其他信息',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
一对多的查询:
情景1:要进行简单的模糊查询,例子:输入“爱”,查出“爱情”、“爱”、“爱情爱”等
查询方式为:
select * from WeNickName where weNickName like "%爱%"
结果为:
情景2:对数据进行精确模糊查询,如;输入天使 查出来 第4和第6条
select * from WeNickName where FIND_IN_SET("天使",weNickName)
结果为:
注意:mysql字符串函数 find_in_set(str1,str2)函数是返回str2中str1所在的位置索引,str2必须以","分割开。like是广泛的模糊匹配,字符串中没有分隔符,Find_IN_SET 是精确匹配,字段值以英文”,”分隔,Find_IN_SET查询的结果要小于like查询的结果。
多对多的查询:
场景一:输入多个查询对象,是模糊查询,例如:输入爱情,天使查出来结果是除了第二、三条其他的数据都应该查出来。
select * from WeNickName where weNickName regexp "爱情|天使"
Q2:使用正则表达和like间的效率
A2:效率上正则表达相对效率低下一些,但是在数量比较小的情况下,使用正则表达式能让sql语句变得简单
场景二:在多对多情况下,想要精确查询,输入天使宜家、天使 那么仅仅会输出第六条
目前我还没有找到比较好且简洁的方式处理这个问题,如果有人知道如何让处理这类问题,欢迎在评论中留言。
多对一的查询
场景一:指多个属性对一个字符进行模糊查询,这种场景比较少见,基本的sql模式语句模式为:
SELECT * FROM `magazine` WHERE CONCAT(`title`,`tag`,`description`) LIKE ‘%关键字%’
欢迎大家关注我,我将不定期更新一些自己在后台开发中遇见的一些通用问题总结帮助大家一起进步。