2016-05-23 11 views
-1

私はmysql関数を作成しようとしました。特定の月は空の結果を返します。空の結果を '0'に設定する必要があります。これを行う方法?ここに私のmysql関数があります。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 

ありがとうございます!

答えて

1
  1. set da = year-month; - >年と月は、それらが整数として解釈されるこのような状況では、しかし、VARCHARのように宣言されています。 '2016-05'のような文字列を作成する場合は、concat()関数を使用してください:concat(year,'-',month)。なぜ私がbigintと宣言したのか全く分かりません。それはvarcharとして宣言する必要があります。

  2. date_format(users.doj,'%Y-%m') <= 'da' - >この式は、年月形式の文字列と文字列 'da'を比較します。 SqlはPHPではないので、変数名は文字列内で展開されません。したがって、式はdate_format(users.doj,'%Y-%m') <= daである必要があります。

  3. 私はあなたが結合のテーブルの順序を混在させたとも思います。あなたは本当に存在しないユーザーのターゲットを持ってはいけません。

  4. クエリを満たすレコードがない場合、select文のifnull()関数は実行されません。このため、特定の場合に空の結果が得られます。 (あなたの機能をどのようにテストしたかは、上記の問題を考えればわかりませんが)。どうやら、最大で1レコードが返されると予想されます。この場合、私は、彼らが値を返すように保証するため、MAX()または分IFNULL内の()関数を()を使用することをお勧め:SELECT ifnull(max(user_target.monthly_target),0) as monthly_target ...

+0

max()またはmin()を使用すると、すべての値がゼロとして返されます。 @Shadow –

+0

これは、クエリが結果を返さないことを意味します。したがって、max()またはmin()は常にNULLを返します。最初に内部クエリを修正する必要があります。私はあなたにそのことを指摘しました。私はもっ​​と何もできません。あなたはサンプルデータと期待される結果とともに別の質問でそれを尋ねるべきです。 – Shadow

+0

私はあなたが言ったように内部クエリを修正し、min()関数を使用しました。 phpmyadminで動作している間はうまく動作します。しかし、PHPでは、空の結果も値を示しています。 @ Shadow –

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

関連する問題