Mysql存储函数给出与原始查询不同的结果(某些条件不起作用)

时间:2013-04-18 00:37:59

标签: mysql sql

我在mysql存储函数中有一个奇怪的问题。与单独运行查询相比,该函数返回的结果不同。这是我的功能:

DELIMITER $$
CREATE DEFINER=`admin`@`%` FUNCTION `getARetention`
(appID int(10), currentDate DATE) 
RETURNS int(11)
    READS SQL DATA
    DETERMINISTIC
BEGIN

  RETURN 
(SELECT count(DISTINCT UserId)
           FROM
               Session 
       WHERE  (Date(Started) = currentDate  AND AppId=appID));
END

以下是我的称呼方式:

SELECT getARetention(5,DATE('2013-04-03'));

以下是单独的查询:

SELECT count(DISTINCT UserId)
           FROM
               Session 
       WHERE  (Date(Started) = DATE('2013-04-03')  AND AppId=5)

该函数返回2502,这是错误的。单独的查询返回5,这是正确的。此外,如果我从单独的查询中删除“AND AppId = 5”,则它返回2502,这意味着在存储的函数中该条件不起作用。

任何人都知道为什么?我暂时没有使用mysql,所以我可能错过了一些东西。

1 个答案:

答案 0 :(得分:4)

MySQL无法区分变量名和列名。

否则命名变量:

DELIMITER $$
CREATE DEFINER=`admin`@`%` FUNCTION `getARetention`
        (
        _appID int(10),
        _currentDate DATE
        ) 
RETURNS int(11)
READS SQL DATA
DETERMINISTIC
BEGIN
        RETURN  (
                SELECT COUNT(DISTINCT UserId)
                FROM   Session 
                WHERE  appId = _appId
                       AND started >= _currentDate
                       AND started < _currentDate + INTERVAL 1 DAY
                );
END
$$