来个朋友帮忙解决下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)

查询日志文件只能有一个 但是你有变通方法

1.如果是在线修改(mysql在运行):

对文件重命名,然后执行外部程序命令mysqlamin flush-logs 或者SQL命令FLUSH LOGS ,如下:

# cd logpath进入日志目录

# mv hostname.log hostname.log.old

# mysqladmin flush-logs

现在你就可以对*.old 文件进行查询 编辑 压缩 甚至删除了

win环境下 相应命令应该会吧?

2.关闭mysql服务器 重命名有关日志文件 再重启服务器就可以了 ~

一、优化表的数据类型

select * from tablename procedure analyse()

select * from tablename procedure analyse(16.265)

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

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

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

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

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

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

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

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

三、逆规范化

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


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存