--场景大致如下:有A B两表,A表中的某一字段bids存放着一个B表主键的数组如3,4,5 而这个时候要做关联查询的时候,理想情况应该可以这样做
select b.* from A a,B b where b.id in (a.bids.split(',')) 但是mysql并不支持这样做,也没有提供类似的做法,所以很糟糕。 有一种变态的做法就是给bids做一下处理,就是
在bids的前后都加上逗号, 这样bids就变成,3,4,5, 这个时候利用模糊查询来做关联就可以达到目的了,做法如下:
 select b.* from A a, B b where CONCAT(CONCAT(',',a.bids),',') LIKE CONCAT(CONCAT('%,',b.id),',%')
select b.* from A a, B b where CONCAT(CONCAT(',',a.bids),',') LIKE CONCAT(CONCAT('%,',b.id),',%') 

 当b的id=3时候的查询相当于执行
当b的id=3时候的查询相当于执行
 select b.* from A a, B b where  ',3,4,5,' LIKE  '%,3,%'
select b.* from A a, B b where  ',3,4,5,' LIKE  '%,3,%'

 ----真实例子----
----真实例子----
 SELECT t.*
SELECT t.*
 FROM tea_material_trade t ,tea_process_product p WHERE p.id =2 AND  CONCAT(CONCAT(',',p.tradeids),',') LIKE CONCAT(CONCAT('%,',t.id),',%')
FROM tea_material_trade t ,tea_process_product p WHERE p.id =2 AND  CONCAT(CONCAT(',',p.tradeids),',') LIKE CONCAT(CONCAT('%,',t.id),',%') 


 --值得注意的是,这样的效率恐怕比较低,小数据量应该没有问题,大数据量估计不能这么做
--值得注意的是,这样的效率恐怕比较低,小数据量应该没有问题,大数据量估计不能这么做


 
mysql像个蛋一样,连基本的函数都不提供,难怪被oracle买了。只有通过存储过程来搞,郁闷得不行。
 DELIMITER $$
DELIMITER $$

 USE `teasys`$$
USE `teasys`$$

 DROP PROCEDURE IF EXISTS `proc_split`$$
DROP PROCEDURE IF EXISTS `proc_split`$$

 CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_split`(
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_split`(
 inputstring VARCHAR(1000),
    inputstring VARCHAR(1000),
 delim CHAR(1)
    delim CHAR(1)
 )
)
 BEGIN
BEGIN
 DECLARE strlen INT;
    DECLARE strlen INT;
 DECLARE last_index INT;
    DECLARE last_index INT;
 DECLARE cur_index INT;
    DECLARE cur_index INT;
 DECLARE cur_char VARCHAR(200);
    DECLARE cur_char VARCHAR(200);
 DECLARE len INT;
    DECLARE len INT;
 SET cur_index=1;
    SET cur_index=1;
 SET last_index=0;
    SET last_index=0;
 SET strlen=LENGTH(inputstring);
    SET strlen=LENGTH(inputstring);  
 DROP TABLE IF EXISTS splittable;
    DROP TABLE IF EXISTS splittable;
 CREATE TEMPORARY TABLE splittable(
    CREATE TEMPORARY TABLE splittable(
 id INT AUTO_INCREMENT,
        id INT AUTO_INCREMENT,
 VALUE VARCHAR(20),
        VALUE VARCHAR(20),
 PRIMARY KEY (`ID`),
        PRIMARY KEY (`ID`),
 UNIQUE KEY `ID` (`ID`)
        UNIQUE KEY `ID` (`ID`)
 ) ;
    ) ;
 WHILE(cur_index<=strlen) DO
    WHILE(cur_index<=strlen) DO    
 BEGIN
    BEGIN
 IF SUBSTRING(inputstring FROM cur_index FOR 1)=delim OR cur_index=strlen THEN
        IF SUBSTRING(inputstring FROM cur_index FOR 1)=delim OR cur_index=strlen THEN
 SET len=cur_index-last_index-1;
            SET len=cur_index-last_index-1;
 IF cur_index=strlen THEN
            IF cur_index=strlen THEN
 SET len=len+1;
               SET len=len+1;
 END IF;
            END IF;
 INSERT INTO splittable(`value`)VALUES(SUBSTRING(inputstring FROM (last_index+1) FOR len));
            INSERT INTO splittable(`value`)VALUES(SUBSTRING(inputstring FROM (last_index+1) FOR len));
 SET last_index=cur_index;
            SET last_index=cur_index;
 END IF;
        END IF;
 SET cur_index=cur_index+1;
        SET cur_index=cur_index+1;
 END;
    END;
 END WHILE;
    END WHILE;
 END$$
END$$

 DELIMITER ;
DELIMITER ;


 CALL proc_split('a,b,c',',');
CALL proc_split('a,b,c',',');
 SELECT * FROM splittable
SELECT * FROM splittable

