У меня есть поле с именем «dealBusinessLocations» (в таблице «dp_deals»), которое содержит некоторые идентификаторы другой таблицы (dp_business_locations) в формате, разделенном запятыми.
dealBusinessLocations
----------------------
0,20,21,22,23,24,25,26
Мне нужно использовать эти значения в функции in() запроса.
как
select * from dp_deals as d left join dp_business_locations as b on(b.businessLocID IN (d.dealBusinessLocations) ;
Sine mysql не поддерживает функцию взрыва строки, я создал хранимую функцию
delimiter //
DROP FUNCTION IF EXISTS BusinessList;
create function BusinessList(BusinessIds text) returns text deterministic
BEGIN
declare i int default 0;
declare TmpBid text;
declare result text default '';
set TmpBid = BusinessIds;
WHILE LENGTH(TmpBid) > 0 DO
SET i = LOCATE(',', TmpBid);
IF (i = 0)
THEN SET i = LENGTH(TmpBid) + 1;
END IF;
set result = CONCAT(result,CONCAT('\'',SUBSTRING(TmpBid, 1, i - 1),'\'\,'));
SET TmpBid = SUBSTRING(TmpBid, i + 1, LENGTH(TmpBid));
END WHILE;
IF(LENGTH(result) > 0)
THEN SET result = SUBSTRING(result,1,LENGTH(result)-1);
END IF;
return result;
END//
delimiter ;
Функция работает идеально.
mysql> BusinessList( '21,22' )
BusinessList( '21,22' )
-----------------------
'21','22'
Но запрос с использованием функции тоже не сработал. вот запрос.
select * from dp_deals as d left join dp_business_locations as b on(b.businessLocID IN (BusinessList(d.dealBusinessLocations)));
Я также пытался использовать статическое значение для аргумента функции, но бесполезно
select * from dp_deals as d left join dp_business_locations as b on(b.businessLocID IN (BusinessList('21,22')));
Кажется, есть некоторая проблема с использованием значения, возвращаемого функцией.
FIND_IN_SET()
. - person ypercubeᵀᴹ   schedule 01.12.2011