Mysql函数返回空结果

时间:2016-05-23 07:58:20

标签: php mysql

我试着创建mysql函数。对于特定月份,它返回空结果。我需要将该空结果设置为' 0'。这该怎么做?这是我的mysql函数。

DELIMITER $$
CREATE FUNCTION `monthtargetbyuser`(`userId` BIGINT,month VARCHAR(11),year VARCHAR(11)) RETURNS int(11)

BEGIN 

DECLARE target,da BIGINT;
 set da = year-month;

        SET target = (SELECT ifnull(user_target.monthly_target,0) as monthly_target from user_target left join users on users.id=user_target.user_id where date_format(users.doj,'%Y-%m') <= 'da' and user_target.year=year and year(users.doj)>0 and users.locked !=1 and users.id =userId );  

   RETURN target;
END

先谢谢!!

2 个答案:

答案 0 :(得分:1)

  1. set da = year-month; - &gt;年和月被声明为varchars,但是,在这种情况下,它们将被解释为整数。如果您想创建一个字符串,例如&#39; 2016-05&#39;,请使用concat()函数:concat(year,'-',month)。我完全不知道你为什么宣称da为bigint。它应该声明为varchar。

  2. date_format(users.doj,'%Y-%m') <= 'da' - &gt;此表达式将年 - 月格式的字符串与字符串&#39; da&#39;进行比较。 Sql不是php,变量名称不会在字符串中展开。因此,表达式应为:date_format(users.doj,'%Y-%m') <= da

  3. 我也相信你混淆了联接中表格的顺序。对于不存在的用户,您不应该有真正的目标。

  4. 如果没有这样的记录可以满足你的查询,那么select语句中的ifnull()函数甚至都不会运行,这就是你在某些情况下获得空结果的原因。 (虽然考虑到上述问题,你如何测试你的功能是超出我的)。显然,您希望最多返回一条记录。在这种情况下,我建议在ifnull()中使用max()或min()函数,因为它们保证返回一个值:SELECT ifnull(max(user_target.monthly_target),0) as monthly_target ...

答案 1 :(得分:0)

我找到了一个解决方案......我在一年又一年的连续中犯了一个错误。这是一个问题。这是我更正后的代码。

DELIMITER $$
CREATE FUNCTION `monthtargetbyuser`(`userId` BIGINT,month int(11),year int(11)) RETURNS BIGINT

BEGIN 

DECLARE target,da varchar(50);
 set da =concat(year,'-',month);

        SET target = (SELECT ifnull(min(user_target.monthly_target),0) as monthly_target from user_target left join users on users.id=user_target.user_id where date_format(users.doj,'%Y-%m') <= da and user_target.year=year and year(users.doj)>0 and users.locked !=1 and users.id =userId ); 

   RETURN target;

END 

非常感谢。 @Shadow