一个MySQL字段包含多个ID的解决办法

如果一个MySQL字段包含多个ID,应该如何解决呢?下面就为您介绍一个处理单个MySQL字段包含多个ID的处理方法,希望对您能有所启迪。

多端合一响应式网站:PC+平板+手机,同一后台修改数据多端同步更新提交您的需求,获取网站建设与营销策划方案报价,我们会在1小时内与您联系!

以下是一个MySQL字段包含多个ID的解决办法完整的例子。

1、新建表

 
 
 
  1. create table Category
  2. (
  3.    cateId                         int(5)                         not null AUTO_INCREMENT,
  4.    chiName                        varchar(80),
  5.    primary key (cateId)
  6. );
  7. drop table if exists OpenRecord;
  8. create table OpenRecord
  9. (
  10.    opreId                         int(5)                         not null AUTO_INCREMENT,
  11.    cateIds                        varchar(80),
  12.    primary key (opreId)                    
  13. );

2、初始化数据

 
 
 
  1. insert Category(chiName) values ('fish'),('shrimp'),('crab'),('tiger');
  2. insert OpenRecord(cateIds) values('1,2');
  3. insert OpenRecord(cateIds) values('2,3');

3、查询OpenRecord中Id为1包括的Category。

#错误的方法

 
 
 
  1. select * 
  2.     from Category
  3.     where (select INSTR(cateIds,cateId) from OpenRecord where opreId=1)

#正确的方法

 
 
 
  1. select * 
  2.     from Category
  3.     where (select FIND_IN_SET(cateId,cateIds) from OpenRecord where opreId=1)

用INSTR会出现当ID大于10的时候,查ID为1的数据,会把1,10,11,12......的都拿出来。

4、扩展会出现的问题。
用FIND_IN_SET可以解决ID是用","号隔开的问题。然而会有另外的两种情况。

A、当ID不包含",",但是用别的符号分开时,如用"|"。我们有如下的解决办法

 
 
 
  1. select * 
  2.     from Category
  3.     where (select FIND_IN_SET(cateId,REPLACE(cateIds,'|',',')) from OpenRecord where opreId=1)

  如果你的这种情况的表很多。我们也可以把它写成函数。(MYSQL 5 下通过)

 
 
 
  1. DELIMITER $$
  2. DROP FUNCTION IF EXISTS fun_instr$$
  3. CREATE FUNCTION fun_instr(ns VARCHAR(100),s TEXT,isplit CHAR(1))
  4.     RETURNS INT(8)
  5.     BEGIN
  6.         DECLARE strPosition INT(8);
  7.         SET strPosition = FIND_IN_SET(ins,REPLACE(s,split,','));
  8.         RETURN strPosition;
  9.     END$$
  10. DELIMITER ;

#使用方法

 
 
 
  1. select * 
  2.     from Category
  3.     where (select fun_instr(cateId,cateIds,',') from OpenRecord where opreId=1)

B、当ID包含",",但是用别的符号分开时,如用"|"。用上面的方法是行不通的。我们有如下的解决办法

 
 
 
  1. DELIMITER $$
  2. DROP FUNCTION IF EXISTS fun_custom_instr$$
  3. CREATE FUNCTION fun_custom_instr(ins VARCHAR(255),s TEXT,split VARCHAR(10))
  4.     RETURNS INT(8)
  5.     BEGIN
  6.         DECLARE splitlen INT(2);
  7.         DECLARE strPosition INT(8);
  8.         SET splitLen = LENGTH(split);
  9.         SET strPosition = 0;
  10.         #第一段的字符相等
  11.         IF s=ins THEN
  12.                 RETURN 1;
  13.         END IF;
  14.         #中间段的字符相等
  15.         WHILE INSTR(s,split)>0 DO
  16.             SET strPositionstrPosition = strPosition + 1;
  17.             IF LEFT(s,INSTR(s,split)-1)=ins THEN
  18.                 RETURN strPosition;
  19.             END IF;            
  20.             SET s = SUBSTRING(s,INSTR(s,split) + splitLen);
  21.         END WHILE;
  22.         #最一段的字符相等
  23.         IF s=ins THEN
  24.                 RETURN strPosition+1;
  25.         END IF;
  26.         RETURN 0;
  27.     END$$
  28. DELIMITER ;

#使用方法

 
 
 
  1. select * 
  2.     from Category
  3.     where (select fun_custom_instr(cateId,cateIds,',') from OpenRecord where opreId=1)

5、总结
以上方法虽然能解决我们的问题,但数据量大的时候速度较慢。彻底的解决办法是设计数据库的时候按照数据库的范式来做。
现在的空间基本已经不是问题,硬件已经很便宜了。

网页标题:一个MySQL字段包含多个ID的解决办法
当前地址:http://www.shufengxianlan.com/qtweb/news37/481437.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联