日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯網營銷解決方案
一個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.5511xx.com/article/cdicspi.html