2016-05-23 2 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; -> год и месяц объявлены VARCHARS, однако, в этом контексте они будут интерпретироваться как целые числа. Если вы хотите создать строку типа «2016-05», используйте функцию concat(): concat(year,'-',month). У меня нет абсолютно никакой идеи, почему вы объявили da как bigint. Он должен быть объявлен как варчар.

  2. date_format(users.doj,'%Y-%m') <= 'da' -> это выражение сравнивает строку в формате year-month со строкой 'da'. Sql не является php, имена переменных не будут расширены в строке. Итак, выражение должно быть: date_format(users.doj,'%Y-%m') <= da.

  3. Я также считаю, что вы перепутали порядок таблиц в соединении. У вас не должно быть цели для пользователя, которого не существует.

  4. Если такой записи не будет удовлетворять ваш запрос, функция ifnull() в инструкции select даже не будет запущена, вот почему вы получаете пустой результат в определенных случаях. (Хотя то, как вы тестировали свою функцию, находится вне меня, учитывая вышеизложенные проблемы). По-видимому, вы ожидаете получить максимум одну запись. В этом случае я предлагаю использовать макс() или мин() функцию в 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

я нашел решение ... Я сделал ошибку в CONCAT из год и месяц. Это создает проблему. Это мой исправленный код.

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