首页 > mysql 如何查询指定的多个以逗号分割值是否在以逗号分隔的数据中

mysql 如何查询指定的多个以逗号分割值是否在以逗号分隔的数据中

mysql 如何查询指定的多个以逗号分割值是否在以逗号分隔的数据中
比如有个table1的表,里面有一栏叫 tag ,tag中的数据为
tag
——
34,2
10
10,34
10,2
10,34,2
查询条件 tag 为34,10的时候 只要求查询出 第二条(10)和第三条(10,34)的记录,
tag为为10,2的时候 只要求查询出 第二条(10)和第四条(10,2)的记录,
多谢~~~~


有个很搓的写法,如果每加一个值就往后面加四个or

select * from table1 where tag = '10' or tag like '%,10' or tag like '10,%' or tag like '%,10,%';


select * from table1 where tag REGEXP '^10(,2)?$' or tag REGEXP '^2(,10)?$';

select * from table1 where tag REGEXP '^34(,10)?$' or tag REGEXP '^10(,34)?$';

使用find_in_set, 正是你想要的,

select * from tags where find_in_set(10, tag);

find_in_set 用于查找这种以逗号分隔的字符串, 该函数返回第一个参数在第二个参数中的位置, 从1开始计算。
比如tag值为10,34的时候, find_in_set(10, tag)返回的结果就是1,如果tag值为34,10的时候, 返回的就是2


由于MySQL没有split功能,因此只能自己弄一个。
但MySQL函数不能返回结果集,所以没法以select xxx()这种方式使用。
也许我们可以写一个procedure,我按题主的要求大致实现了一个,或许可以参考一下:

DROP PROCEDURE IF EXISTS containsOnly;
DELIMITER $$
CREATE PROCEDURE containsOnly(search VARCHAR(600)) 
BEGIN
    DECLARE result varchar(100);
    DECLARE i INT DEFAULT 1;
    DROP TABLE IF EXISTS tmp_table;
    CREATE TEMPORARY TABLE tmp_table ( 
        tag VARCHAR(100) NOT NULL,
        replacedtag VARCHAR(100)
    );

    insert into tmp_table(tag,replacedtag) select tag,replace(concat('|',tag,'|'),',','||') from table1;
    label:LOOP
        SET result = REPLACE(SUBSTRING(SUBSTRING_INDEX(search, ',', i)
         , LENGTH(SUBSTRING_INDEX(search, ',', i - 1)) + 1), ',', '');

        IF result = '' THEN
            LEAVE label;
        END IF;

        update tmp_table set replacedtag = replace(replacedtag,concat('|',result,'|'),'');
        SET i=i+1;

    END LOOP;

    select tag from tmp_table where replacedtag='';
END $$



调用起来很方便,只需要:

call containsOnly('2,10')
【热门文章】
【热门文章】