2017-06-09 65 views
1

我用一个简单的存储过程,努力从2个表收集数据并发送回PHP:mysql如何返回NULL值,如果没有记录

BEGIN 

DECLARE cur_name VARCHAR(50); 

SELECT currency_name INTO cur_name FROM currencies WHERE id = currency_id_var; 
SELECT cur_name, sum(amount) AS income_amount, currency_id, month(income_date) AS month_of_income 
    FROM incomes 
    WHERE user_id = user_id_var 
     AND currency_id = currency_id_var 
     AND income_date > year_beginning_var 
     AND month(income_date) = month_var 
    GROUP BY currency_id; 

END 

它的工作好,除非是在'收入'表中找不到记录。我需要使用'cur_name'设置(它始终有一些值)和其余变量(income_amount,currency_id,month_of_income)设置为NULL的过程的响应。 我在问一些无法做到的事情吗? 我试图使它与选择IFNULLUNION SELECT NULL种命令,没有成功... 谢谢!

+0

我不确定,但你应该检查[this](https://stackoverflow.com/questions/28089275/select-statement-to-return-constant-when-no-records-found-in-table-in -sql-server#answer-28090639) –

回答

0

你可以两个查询合并成一个LEFT JOIN,像这样:

SELECT currency_name as cur_name, 
     income_amount, 
     currency_id, 
     month_of_income 
    FROM currencies 
    LEFT JOIN 
     (
      SELECT cur_name, sum(amount) AS income_amount, currency_id, month(income_date) AS month_of_income 
       FROM incomes 
       WHERE user_id = user_id_var 
        AND currency_id = currency_id_var 
        AND income_date > year_beginning_var 
        AND month(income_date) = month_var 
       GROUP BY currency_id; 
     ) 
     ON currency_id = currencies.id 
    WHERE currencies.id = currency_id_var; 

未经检验的,但你的想法:这是一个LEFT JOIN,所以它是保证返回至少一行对每个匹配行左表(currencies),如果右表(子查询)不产生任何结果,则相应的字段将返回为NULL

为了更好的可读性,我会考虑将子查询移动到视图,然后左键连接。

+0

感谢您的回复!我明白了,但我不是SQL专家,看起来代码段中存在语法错误(SQL错误1064)... – dujmovicv

+0

子查询必须有别名 - 在这种情况下)和我建议)s上 –

相关问题