我的mysql查询有一个奇怪的情况:
使用WHERE unterkategorie IN (children_csv(1))
时没有结果。
当我将函数名替换为单独执行时函数的结果时,第二个"WHERE unterkategorie IN (11,12,13,28,29,32,14,15,16,30,31,33,34,35)"
正在获取记录
完整查询是:
SELECT k.name category_name,
p.unterkategorie,
p.artikelnummer,
p.hauptkategorie,
p.id,
p.name product_name,
p.preis,
p.sortierung,
p.verpackungseinheit
FROM produkte p, kategorie k
WHERE unterkategorie IN (children_csv(1))
WHERE unterkategorie IN (11,12,13,28,29,32,14,15,16,30,31,33,34,35)
AND p.unterkategorie = k.id
ORDER BY unterkategorie, p.sortierung
以下是功能定义
delimiter //
CREATE DEFINER=`root`@`localhost` FUNCTION `children_csv`(child int)RETURNS varchar(1000) CHARSET utf8
BEGIN
declare return_value varchar(1000);
SELECT GROUP_CONCAT(Level SEPARATOR ',')childrens into return_value FROM (
SELECT @Ids := (
SELECT GROUP_CONCAT(`id` SEPARATOR ',')
FROM `kategorie`
WHERE FIND_IN_SET(`parent`, @Ids)
ORDER BY parent, sortierung
) Level
FROM `kategorie`
JOIN (SELECT @Ids := child) temp1
WHERE FIND_IN_SET(`parent`, @Ids)
) temp2;
RETURN return_value;
END;
//
delimiter ;
答案 0 :(得分:0)
您的函数返回单个值,即字符串。它没有返回值列表(因为MySQL函数不这样做)。如果您想直接使用该功能,可以使用find_in_set()
:
WHERE find_in_set(unterkategorie, children_csv(1))
我会提醒您,MySQL无法在unterkategorie
上使用索引,因此这可能会更慢。
如果您想要更快的查询,那么您可以将查询构造为字符串(称为动态SQL)并使用prepare
和exec
来运行它。
如果您使用其他编程语言,则需要了解函数不是提高SQL性能的途径。将逻辑移动到函数中通常无助于提高性能。