【问题标题】:Mysql how to return NULL values if there is no recordMysql如果没有记录如何返回NULL值
【发布时间】:2017-06-09 10:16:46
【问题描述】:

我正在使用一个简单的存储过程从 2 个表中收集数据并发送回 PHP:

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 的过程的响应。 我在问一些不能做的事情吗? 我试图让它与 SELECT IFNULLUNION SELECT NULL 类型的命令一起工作,但没有成功...... 谢谢!

【问题讨论】:

  • 我不确定,但你应该检查this

标签: php mysql stored-procedures


【解决方案1】:

您可以将这两个查询组合成一个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

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

【讨论】:

  • 感谢您的回复!我明白了,但我不是 SQL 专家,而且您的代码 sn-p 中似乎存在语法错误(SQL 错误 1064)...
  • 子查询必须有别名 - 在这种情况下,我建议在 ) 和 on 之间 ) s on
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-26
  • 1970-01-01
  • 2013-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多