需求是这样的:项目中有一张模板表,模板项中有个大字段,存放这个模板具体的模板项信息以json字符串形式存放在该字段中,这样的好处是只有一张表,不用维护传统的模板表和模板项这两张表,而且查询时候的效率更高,应该只查询一张表嘛。不用进行连表查询。当然带来的缺点就是如果存在以模板项这个大字段的条件查询会很不方便。一开始经过讨论决定该字段制作保存和读取不存在针对该字段的条件查询,所有就这么做了。
但是后面由于需求的进一步细化,有个这么个需求:
当客户选择了具体的模板项后,要先查询之前的模板是否存在相同的模板项,如果存在校验不通过,尴尬了需要由模板项组成的条件查询需求。
一开始的想法是 where itemcode like ‘%模板项A%‘ and itemcode like ‘%模板项B%‘ itemcode like ‘%模板项C%‘ itemcode like ‘%模板项D%‘ ...
后来发现不行 比如说有个模板A 包含:模板项A,模板项B
现在我要新建一个模板B包含:模板项A ,不和模板A重复模板项吧。但是通过like查询还是区分不了。
还好之前看MySQL有全文检索这个功能,在这小试了一把,具体实现如下:
创建模板表:
CREATE TABLE `enquiry_template_test` ( `template_id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT ‘模板的id‘, `template_name` VARCHAR(60) COLLATE utf8_bin DEFAULT NULL COMMENT ‘模板名称‘, `company_id` BIGINT(20) DEFAULT NULL COMMENT ‘采购商公司‘, `company_name` VARCHAR(60) COLLATE utf8_bin DEFAULT NULL COMMENT ‘采购商公司名称‘, `item_code` TEXT COLLATE utf8_bin COMMENT ‘模板项信息‘, `valid_flag` TINYINT(4) DEFAULT ‘0‘ COMMENT ‘是否有效0有效,1失效‘, `created_time` DATETIME DEFAULT NULL COMMENT ‘创建时间‘, `user_id` BIGINT(20) NOT NULL COMMENT ‘创建人‘, PRIMARY KEY (`template_id`), FULLTEXT (item_code) ) ENGINE=MYISAM AUTO_INCREMENT=1130 DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=‘模板表信息‘
注意:mysql要使用全文检索,搜索引擎为MYISAM,需求添加FULLTEXT,可以在建表时添加,如果存在数据的导入,可以在导入后再添加,我感觉是你懂的,索引嘛,查询快,插删改来着慢。
因为我的数据量比较小,就不计较这些了。
移植原表的数据:
INSERT INTO enquiry_template_test SELECT * FROM enquiry_template;
进行查询:
SELECT * FROM `enquiry_template_test` WHERE MATCH(item_code) AGAINST(‘+0001 +0010 -0002 -0003 -0004 -0005 -0006 -0007 -0008 -0009 -0010 -0011 -0012 -0014 +0015‘ IN BOOLEAN MODE);
因为所有的模板项是固定的code分别从0001到0015。
当前台传递是否存在一个有0001,0010,0015三个模板项的模板的查询
虽然sql比较难看,但是至少满足需求了。