【问题标题】:MySQL IFNULL is not returning resultMySQL IFNULL 不返回结果
【发布时间】:2019-09-01 14:58:03
【问题描述】:

我正在尝试使用以下方法获取剩余数量的书籍

库存=总计+(收到-已发行);

Table book_qnt - 图书数量列表

id  |   book    |   qnt
=======================
1   |   1       |   20  
2   |   2       |   12  

Table book - 书籍列表

id  |   ttl
===========
1   |   Social Experiment
2   |   Evolution of Culture

Table book_trns - 图书交易清单

id  |   bk  |   std |   iss |   rcv |   dte
==========================================
1   |   2   |   1   |   6   |   0   |   2019-04-11
2   |   2   |   2   |   4   |   0   |   2019-04-05

只有那些有接收和发出值的书才可以。

DB语言中,显示book_trans.rcvbook_trans.iss不是NULL的书籍的结果

SELECT 
book.id AS book, 
book_qnt.qnt+((SUM(book_trans.rcv))-(SUM(book_trans.iss))) AS stock,

结果

book|   stock
===========
1   |   NULL    
2   |   2

现在我尝试获取如下结果,如果book_trans.rcvbook_trans.issNULL,那么它应该从book_qnt 获取总计qnt

期望的结果

book|   stock
===========
1   |   20   // id 1's book_trans.rcv and book_trans.iss is NULL, so it should show total qnt
2   |   2    // id 2's book_trans.rcv and book_trans.iss is not NULL, so it is calculating

我该怎么做如果book_trans.rcvbook_trans.iss 行为Null,则赋值为0。

SELECT 
    book.id AS book, 
    book_qnt.qnt+((IFNULL(0, SUM(book_trans.rcv)))-(IFNULL(0, SUM(book_trans.iss)))) AS stock,

但结果(计算不起作用)

book|   qnt
===========
1   |   20
2   |   12

完整的 MySQL

SELECT 
    book_qnt.qnt+((IFNULL(0, SUM(book_trans.rcv)))-(IFNULL(0, SUM(book_trans.iss)))) AS stock,
    lib_bk.id, 
    lib_bk.ttl 
FROM 
    book
JOIN 
    book_qnt ON book_qnt.book=book.id 
LEFT JOIN
    book_trans ON book_trans.bk=book.id
GROUP BY book.id

【问题讨论】:

  • '如果expr1不为NULL,IFNULL()返回expr1;否则返回 expr2。 - dev.mysql.com/doc/refman/8.0/en/… 0 永远不会为空。
  • @P.Salmon,在我的查询中,我能做什么而不是 IFNULL

标签: mysql ifnull


【解决方案1】:

你在空测试中的 0 替换是错误的。试试这个

SELECT 
     book_qnt.qnt , SUM(book_trns.rcv), SUM(book_trns.iss),
     ((IFNULL(SUM(book_trns.rcv),0))-(IFNULL(SUM(book_trns.iss),0))),
     book_qnt.qnt+((IFNULL(SUM(book_trns.rcv),0))-(IFNULL(SUM(book_trns.iss),0))) AS stock,
    book.id, 
    book.ttl 
FROM 
    book
JOIN 
    book_qnt ON book_qnt.book=book.id 
LEFT JOIN
    book_trns ON book_trns.bk=book.id
GROUP BY book.id;

+------+--------------------+--------------------+-----------------------------------------------------------------+-------+------+----------------------+
| qnt  | SUM(book_trns.rcv) | SUM(book_trns.iss) | ((IFNULL(SUM(book_trns.rcv),0))-(IFNULL(SUM(book_trns.iss),0))) | stock | id   | ttl                  |
+------+--------------------+--------------------+-----------------------------------------------------------------+-------+------+----------------------+
|   20 |               NULL |               NULL |                                                               0 |    20 |    1 | Social Experiment    |
|   12 |                  0 |                 10 |                                                             -10 |     2 |    2 | Evolution of Culture |
+------+--------------------+--------------------+-----------------------------------------------------------------+-------+------+----------------------+
2 rows in set (0.00 sec)

请尽量保持您的表名与查询一致。

【讨论】:

  • 感谢您的回答,我最近使用 CASE 条件 -CASE WHEN book_trans.bk = book.id THEN book_qnt.qnt+((SUM(book_trans.rcv))-(SUM(book_trans.iss))) ELSE book_qnt.qnt END AS stock,在我的查询中IFNULLCASE 会更快或更好。
  • 不知道,但现代趋势似乎更喜欢合并。dev.mysql.com/doc/refman/8.0/en/…
猜你喜欢
  • 2012-11-03
  • 2017-03-24
  • 1970-01-01
  • 2021-01-04
  • 2011-09-30
  • 1970-01-01
  • 2015-10-01
  • 2018-09-17
  • 1970-01-01
相关资源
最近更新 更多