Ответ 1
Это также работает:
SELECT * FROM table WHERE 3 IN (NUMBERS) AND 15 IN (NUMBERS)
используя IN, будет выглядеть строка, разделенная запятыми, например. эти два
WHERE banana IN ('apple', 'banana', 'coconut')
WHERE 3 IN (2,3,6,8,90)
У меня есть таблица вроде этого:
UID(int) NUMBERS(blob)
----------------------
1 1,13,15,20
2 3,10,15,20
3 3,15
И я хотел бы протестировать, если 3 и 15 находятся в блоке под названием NUMBERS. И можете видеть, что LIKE %% нельзя использовать
Выбирается только строка с ID 2 и тремя scoulb...
Это также работает:
SELECT * FROM table WHERE 3 IN (NUMBERS) AND 15 IN (NUMBERS)
используя IN, будет выглядеть строка, разделенная запятыми, например. эти два
WHERE banana IN ('apple', 'banana', 'coconut')
WHERE 3 IN (2,3,6,8,90)
Не самое приятное решение, но оно работает:
select
UID
from
YOUR_TABLE
where
find_in_set('3', cast(NUMBERS as char)) > 0
and
find_in_set('15', cast(NUMBERS as char)) > 0
Обратите внимание, что это сравнение строк, поэтому вам может потребоваться также ввести ваши входные параметры в char.
Также проверьте, полезно ли это кому-либо
Расширенная функция для исключения ограничения native FIND_IN_SET()
в MySQL, эта новая расширенная версия FIND_IN_SET_X()
предоставляет функцию сравнения одного списка с другим списком.
то есть.
mysql> SELECT FIND_IN_SET_X('x,c','a,b,c,d'); -> 3
Оформить эту ссылку для получения более подробной информации.
Вы можете попробовать следующее:
SELECT * FROM table_name WHERE FIND_IN_SET('3', NUMBERS) AND FIND_IN_SET('15', NUMBERS)
Функция завершена для вас
DELIMITER $$
CREATE FUNCTION `FIND_IN_SET_X`(inputList TEXT,targetList TEXT) RETURNS INT(11)
DETERMINISTIC
BEGIN
DECLARE limitCount INT DEFAULT 0 ;
DECLARE counter INT DEFAULT 0 ;
DECLARE res INT DEFAULT 0 ;
DECLARE temp TEXT ;
SET limitCount = 1 + LENGTH(inputList) - LENGTH(REPLACE(inputList, ',', '')) ;
simple_loop :
LOOP
SET counter = counter + 1 ;
SET temp = SUBSTRING_INDEX(SUBSTRING_INDEX(inputList, ',', counter),',',- 1) ;
SET res = FIND_IN_SET(temp, targetList) ;
IF res > 0
THEN LEAVE simple_loop ;
END IF ;
IF counter = limitCount
THEN LEAVE simple_loop ;
END IF ;
END LOOP simple_loop ;
RETURN res ;
END$$
DELIMITER ;
find_in_set_x
создайте новую функцию в mysql и вставьте следующее (не моя работа кстати)
BEGIN
DECLARE limitCount INT DEFAULT 0;
DECLARE counter INT DEFAULT 0;
DECLARE res INT DEFAULT 0;
DECLARE temp TEXT;
SET limitCount = 1 + LENGTH(inputList) - LENGTH(REPLACE(inputList, ',',''));
simple_loop:LOOP
SET counter = counter + 1;
SET temp = SUBSTRING_INDEX(SUBSTRING_INDEX(inputList,',',counter),',',-1);
SET res = FIND_IN_SET(temp,targetList);
IF res > 0 THEN LEAVE simple_loop; END IF;
IF counter = limitCount THEN LEAVE simple_loop; END IF;
END LOOP simple_loop;
RETURN res;
END