mysql其中columnname in(function(a value))不起作用

时间:2017-08-20 13:49:00

标签: mysql where

我的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 ;

1 个答案:

答案 0 :(得分:0)

您的函数返回单个值,即字符串。它没有返回值列表(因为MySQL函数不这样做)。如果您想直接使用该功能,可以使用find_in_set()

WHERE find_in_set(unterkategorie, children_csv(1))

我会提醒您,MySQL无法在unterkategorie上使用索引,因此这可能会更慢。

如果您想要更快的查询,那么您可以将查询构造为字符串(称为动态SQL)并使用prepareexec来运行它。

如果您使用其他编程语言,则需要了解函数不是提高SQL性能的途径。将逻辑移动到函数中通常无助于提高性能。