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')