来个朋友帮忙解决下MYSQL查询中字段带逗号分割符的问题

来个朋友帮忙解决下MYSQL查询中字段带逗号分割符的问题,第1张

?

首先我们建立一张带有逗号分隔的字符串。

CREATE TABLE test(id int(6) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id),pname VARCHAR(20) NOT NULL,pnum VARCHAR(50) NOT NULL)

然后插入带有逗号分隔的测试数据

INSERT INTO test(pname,pnum) VALUES('产品1','1,2,4')

INSERT INTO test(pname,pnum) VALUES('产品2','2,4,7')

INSERT INTO test(pname,pnum) VALUES('产品3','3,4')

INSERT INTO test(pname,pnum) VALUES('产品4','1,7,8,9')

INSERT INTO test(pname,pnum) VALUES('产品5','33,4')

查找pnum字段中包含3或者9的记录

mysql>SELECT * FROM test WHERE find_in_set('3',pnum) OR find_in_set('9',pnum)

+----+-------+---------+

| id | pname | pnum|

+----+-------+---------+

| 3 | 产品3 | 3,4 |

| 4 | 产品4 | 1,7,8,9 |

+----+-------+---------+

2 rows in set (0.03 sec)

使用正则

mysql>SELECT * FROM test WHERE pnum REGEXP '(3|9)'

+----+-------+---------+

| id | pname | pnum|

+----+-------+---------+

| 3 | 产品3 | 3,4 |

| 4 | 产品4 | 1,7,8,9 |

| 5 | 产品5 | 33,4|

+----+-------+---------+

3 rows in set (0.02 sec)

这样会产生多条记录,比如33也被查找出来了,不过MYSQL还可以使用正则,挺有意思的

find_in_set()函数返回的所在的位置,如果不存在就返回0

mysql>SELECT find_in_set('e','h,e,l,l,o')

+------------------------------+

| find_in_set('e','h,e,l,l,o') |

+------------------------------+

|2 |

+------------------------------+

1 row in set (0.00 sec)

还可以用来排序,如下

mysql>SELECT * FROM TEST WHERE id in(4,2,3)

+----+-------+---------+

| id | pname | pnum|

+----+-------+---------+

| 2 | 产品2 | 2,4,7 |

| 3 | 产品3 | 3,4 |

| 4 | 产品4 | 1,7,8,9 |

+----+-------+---------+

3 rows in set (0.03 sec)

如果想要按照ID为4,2,3这样排序呢?

mysql>SELECT * FROM TEST WHERE id in(4,2,3) ORDER BY find_in_set(id,'4,2,3')

+----+-------+---------+

| id | pname | pnum|

+----+-------+---------+

| 4 | 产品4 | 1,7,8,9 |

| 2 | 产品2 | 2,4,7 |

| 3 | 产品3 | 3,4 |

+----+-------+---------+

3 rows in set (0.03 sec)

一、优化表的数据类型

select * from tablename procedure analyse()

select * from tablename procedure analyse(16.265)

上面输出一列信息,牟你数据表的字段提出优化建义,

二、通过拆分表提高数据访问效率

拆分一是指针对表进行拆分,如果是针对myisam类型的表进行处理的话,可以有两种拆分方法

1、是垂直拆分,把主要的与一些散放到一个表,然后把主要的和另外的列放在另一张表。

2、水平拆分方法,根据一列或多列的值把数据行放到两个独立的表中,水平拆分通常几种情况。

表很大,拆分后可降低查询时数据和索引的查询速度,同时也降低了索引的层数,提高查询的速度。

表中的数据本来就有独立性,表中分别记录各个地区的数据或不同时期的数据,特别是有些数据常用,厕国一些数据不常用的情况下,

需要把数据存放到多个不同的介质上。

三、逆规范化

四、使用中间表优化方法对于数据库教程大的表,在进行统计查询时通常会比较慢的,并且还要考虑查询是否会对在线应用产生影响,通常这种情况下我们使用中间表可以提高查询统计速度

mysql查询含逗号的数据,将逗号拆分为多行展示: 原始数据如下: 现在因为新的需求,需要将这些数据转化为如下形式: 假设我们需要处理的表结构为: 使用如下sql语句即可实现需求: 查询的主要思路为,原表与一个包含连续自增长字段的表进行join,得到字符串分隔后的索引值,其中 length( a.name ) - length( REPLACE ( a.name, ',', '' ) ) + 1 语句获得字符串逗号分隔之后得到的数据长度,两表关联之后,会得到相应行数的数据。比如, 在join之后会得到: 之后对查询中的结果,使用substring_index方法进行截取,然后得到我们自己想要的数据。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/7337665.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-04
下一篇 2023-04-04

发表评论

登录后才能评论

评论列表(0条)

保存