php 数组内容搜素MYSQL_MYSQL精确搜索和PHP数组操作的问题

我的理解是你的表中个别记录存在用“,”分隔的tag,但是你在查询SQL时希望将“,”分隔的tag像独立记录那样查询,并去重。

我说下我在SQL里处理这个事情的思路,当然如果数据量大的话性能肯定很差,因为涉及到太多的字符串操作,而本身mysql不支持split。如果使用一条SQL把它查出来,首先需要总结你的数据的规律,比如你的记录中含有“,”分隔的tag数最多有多少个,我下面的代码假设根据你的数据:php

php,mysql

jquery

html

php

ruby

java,jquery,js

java

html

css

中最多一条记录含有三个tag,含有两个逗号。先用代码创建你所说的场景数据:/*!40101 SET NAMES utf8 */;

create table `tags` (

`tag` varchar (150)

);

insert into `tags` (`tag`) values('php');

insert into `tags` (`tag`) values('php,mysql');

insert into `tags` (`tag`) values('jquery');

insert into `tags` (`tag`) values('html');

insert into `tags` (`tag`) values('php');

insert into `tags` (`tag`) values('ruby');

insert into `tags` (`tag`) values('java,jquery,js');

insert into `tags` (`tag`) values('java');

insert into `tags` (`tag`) values('html');

insert into `tags` (`tag`) values('css');

然后执行如下SQL查询:SELECT DISTINCT tag FROM (

SELECT DISTINCT tag FROM tags WHERE tag NOT LIKE '%,%'

UNION

SELECT DISTINCT SUBSTRING_INDEX(tag , ',', 1) AS tag FROM tags WHERE tag LIKE '%,%'

UNION

SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING(tag ,INSTR(tag ,',')+1),',', 1) AS tag FROM tags WHERE SUBSTRING(tag ,INSTR(tag ,',')+1) LIKE '%,%'

UNION

SELECT DISTINCT SUBSTRING_INDEX(tag , ',', -1) AS tag FROM tags WHERE tag LIKE '%,%'

) t

可以得到结果:tag

php

jquery

html

ruby

java

css

mysql

js

方法很笨,分别通过四次查询得到结果后合并去重,分别是查询无逗号分隔的记录中的所有tag并去重(去重的目的是减少合并时的数据量);

查询有逗号分隔的记录中的第一个tag,然后去重;

查询有逗号分隔的记录中的第二个tag,然后去重;

查询有逗号分隔的记录中的第三个tag,然后去重;

合并以上所有记录后再次去重,得到结果;

一个复合SQL就得到了结果,当然这个SQL的扩展性很差,性能也不好,如果你的数据格式做了变化,甚至单条记录中的逗号数更多的时候,这条SQL就game over了。建议通过sp来动态实现,这样可以更好的适应单条记录中tag规模的增长,否则像我上面那样,逗号一多就崩溃了。如果是在php或java里做这个事情,我相信方便的多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值