新聞中心
如果一個(gè)MySQL字段包含多個(gè)ID,應(yīng)該如何解決呢?下面就為您介紹一個(gè)處理單個(gè)MySQL字段包含多個(gè)ID的處理方法,希望對(duì)您能有所啟迪。

多端合一響應(yīng)式網(wǎng)站:PC+平板+手機(jī),同一后臺(tái)修改數(shù)據(jù)多端同步更新提交您的需求,獲取網(wǎng)站建設(shè)與營(yíng)銷策劃方案報(bào)價(jià),我們會(huì)在1小時(shí)內(nèi)與您聯(lián)系!
以下是一個(gè)MySQL字段包含多個(gè)ID的解決辦法完整的例子。
1、新建表
- create table Category
- (
- cateId int(5) not null AUTO_INCREMENT,
- chiName varchar(80),
- primary key (cateId)
- );
- drop table if exists OpenRecord;
- create table OpenRecord
- (
- opreId int(5) not null AUTO_INCREMENT,
- cateIds varchar(80),
- primary key (opreId)
- );
2、初始化數(shù)據(jù)
- insert Category(chiName) values ('fish'),('shrimp'),('crab'),('tiger');
- insert OpenRecord(cateIds) values('1,2');
- insert OpenRecord(cateIds) values('2,3');
3、查詢OpenRecord中Id為1包括的Category。
#錯(cuò)誤的方法
- select *
- from Category
- where (select INSTR(cateIds,cateId) from OpenRecord where opreId=1)
#正確的方法
- select *
- from Category
- where (select FIND_IN_SET(cateId,cateIds) from OpenRecord where opreId=1)
用INSTR會(huì)出現(xiàn)當(dāng)ID大于10的時(shí)候,查ID為1的數(shù)據(jù),會(huì)把1,10,11,12......的都拿出來(lái)。
4、擴(kuò)展會(huì)出現(xiàn)的問(wèn)題。
用FIND_IN_SET可以解決ID是用","號(hào)隔開的問(wèn)題。然而會(huì)有另外的兩種情況。
A、當(dāng)ID不包含",",但是用別的符號(hào)分開時(shí),如用"|"。我們有如下的解決辦法
- select *
- from Category
- where (select FIND_IN_SET(cateId,REPLACE(cateIds,'|',',')) from OpenRecord where opreId=1)
如果你的這種情況的表很多。我們也可以把它寫成函數(shù)。(MYSQL 5 下通過(guò))
- DELIMITER $$
- DROP FUNCTION IF EXISTS fun_instr$$
- CREATE FUNCTION fun_instr(ns VARCHAR(100),s TEXT,isplit CHAR(1))
- RETURNS INT(8)
- BEGIN
- DECLARE strPosition INT(8);
- SET strPosition = FIND_IN_SET(ins,REPLACE(s,split,','));
- RETURN strPosition;
- END$$
- DELIMITER ;
#使用方法
- select *
- from Category
- where (select fun_instr(cateId,cateIds,',') from OpenRecord where opreId=1)
B、當(dāng)ID包含",",但是用別的符號(hào)分開時(shí),如用"|"。用上面的方法是行不通的。我們有如下的解決辦法
- DELIMITER $$
- DROP FUNCTION IF EXISTS fun_custom_instr$$
- CREATE FUNCTION fun_custom_instr(ins VARCHAR(255),s TEXT,split VARCHAR(10))
- RETURNS INT(8)
- BEGIN
- DECLARE splitlen INT(2);
- DECLARE strPosition INT(8);
- SET splitLen = LENGTH(split);
- SET strPosition = 0;
- #第一段的字符相等
- IF s=ins THEN
- RETURN 1;
- END IF;
- #中間段的字符相等
- WHILE INSTR(s,split)>0 DO
- SET strPositionstrPosition = strPosition + 1;
- IF LEFT(s,INSTR(s,split)-1)=ins THEN
- RETURN strPosition;
- END IF;
- SET s = SUBSTRING(s,INSTR(s,split) + splitLen);
- END WHILE;
- #最一段的字符相等
- IF s=ins THEN
- RETURN strPosition+1;
- END IF;
- RETURN 0;
- END$$
- DELIMITER ;
#使用方法
- select *
- from Category
- where (select fun_custom_instr(cateId,cateIds,',') from OpenRecord where opreId=1)
5、總結(jié)
以上方法雖然能解決我們的問(wèn)題,但數(shù)據(jù)量大的時(shí)候速度較慢。徹底的解決辦法是設(shè)計(jì)數(shù)據(jù)庫(kù)的時(shí)候按照數(shù)據(jù)庫(kù)的范式來(lái)做。
現(xiàn)在的空間基本已經(jīng)不是問(wèn)題,硬件已經(jīng)很便宜了。
文章題目:一個(gè)MySQL字段包含多個(gè)ID的解決辦法
文章來(lái)源:http://fisionsoft.com.cn/article/cdicspi.html


咨詢
建站咨詢
