У меня есть функция MySQL "GetChildren (id)", которая возвращает список идентификаторов, разделенных запятыми, которые являются дочерними элементами идентификатора, переданного функции.
Я хотел бы использовать вывод этой функции следующим образом:
SELECT * FROM table WHERE id IN (GetChildren(36))
и если id 36 имел идентификаторы детей 37,38 и 39, я бы получил эти три строки назад.
Однако происходит то, что я получаю только первый идентификатор.
У скрипта SQL, казалось, были трудности с функциями, но вот упрощенный пример, демонстрирующий проблему:
CREATE TABLE test (
'ID' int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO test (ID) VALUES (1),(2),(3),(4);
DELIMITER $$
DROP FUNCTION IF EXISTS 'TestFN' $$
CREATE FUNCTION 'TestFN' (GivenID VARCHAR(1024)) RETURNS varchar(1024) CHARSET latin1
DETERMINISTIC
BEGIN
RETURN '2,3,4';
END $$
DELIMITER ;
После установки, если я запустил SELECT TestFN(1)
, я вернусь 2,3,4
как ожидалось.
Если я запускаю SELECT ID FROM test WHERE ID IN (TestFN1)
, я возвращаю только одну строку с идентификатором 2. То же самое происходит с SELECT ID FROM test WHERE ID = (TestFN1)
Есть ли способ использовать вывод этой функции для использования, как если бы я ввел идентификаторы в ID IN (...)
?
Я думаю, что MySQL должен будет поддерживать табличные функции, чтобы вы могли использовать их таким образом. В противном случае IN ведет себя так, как ожидалось, someInt IN (astring)
список IN в ints, оценивая в вашем случае ID IN (2)
Тем не менее, вы, вероятно, можете использовать FIND_IN_SET способом, похожим на то, что вы пытаетесь.
Что-то вроде FIND_IN_SET(ID, GetChildren(36)) > 0