一个MySQL字段包含多个ID的解决办法
创始人
2024-07-18 08:50:18
0

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

以下是一个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.  
  8. drop table if exists OpenRecord;  
  9. create table OpenRecord  
  10. (  
  11.    opreId                         int(5)                         not null AUTO_INCREMENT,  
  12.    cateIds                        varchar(80),  
  13.    primary key (opreId)                      
  14. );  
  15.  

2、初始化数据

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

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.  
  3. DROP FUNCTION IF EXISTS fun_instr$$  
  4.  
  5. CREATE FUNCTION fun_instr(ns VARCHAR(100),s TEXT,isplit CHAR(1))  
  6.     RETURNS INT(8)  
  7.     BEGIN  
  8.  
  9.         DECLARE strPosition INT(8);  
  10.  
  11.         SET strPosition = FIND_IN_SET(ins,REPLACE(s,split,','));  
  12.         RETURN strPosition;  
  13.     END$$  
  14.  
  15. DELIMITER ;  
  16.  

#使用方法

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

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

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

#使用方法

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

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


 

 

【编辑推荐】

MySQL截取字符串函数方法

MySQL多个条件判断示例

MySQL字符串处理

MySQL大表重复字段的查询方法

mysql查询大小写问题

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...
《非诚勿扰》红人闫凤娇被曝厕所... 【51CTO.com 综合消息360安全专家提醒说,“闫凤娇”、“非诚勿扰”已经被黑客盯上成为了“木...