MySQL在条件条件下与NULL的比较

时间:2018-09-22 10:23:59

标签: php mysql

我有一个像这样的MySql表结构:(用于英语句子学习系统):

learn_status column可以是01

3 practices columns可以是NULL-101

╔═════════════╦══════════════╦════════════╦════════════╦════════════╦════════╗
║ sentence_id ║ learn_status ║ practice_1 ║ practice_2 ║ practice_3 ║ others ║
╠═════════════╬══════════════╬════════════╬════════════╬════════════╬════════╣
║      0      ║       1      ║    NULL    ║    NULL    ║    NULL    ║  more  ║
║      1      ║       0      ║      1     ║      0     ║      1     ║  more  ║
║      2      ║       0      ║     -1     ║    NULL    ║      0     ║  more  ║
║      3      ║       0      ║    NULL    ║    NULL    ║    NULL    ║  more  ║
║      4      ║       0      ║      1     ║      1     ║      1     ║  more  ║
╚═════════════╩══════════════╩════════════╩════════════╩════════════╩════════╝

我想获得具有2个条件的句子:

  1. 学习状态应该为0
  2. 所有3个练习列都不同时等于1。

(如果Practice_1 = 1&Practice_2 = 1&Practice_3 = 1 同时,则应该返回记录)

(如果其中一个等于1,就可以了,那么它应该返回记录)


我使用以下MySQL代码,但无法正常工作:

SELECT * FROM learnbox WHERE learn_status=0 AND NOT (practice_1=1 AND practice_2=1 AND practice_3=1)

它应该返回上表的3条记录:句子ID =(1&2&3)记录。

但是它返回唯一的statement_id =(1&2)并且不能正常工作。

谢谢

1 个答案:

答案 0 :(得分:2)

如果操作数中至少一个是=,则比较运算符NULL将返回NULL。因此,对于sentence_id = 3,您将在所有三个练习场条件下获得NULL

此外,NOT NULLNULL;因此对于sentence_id = 3,您的Where条件将为TRUE AND NULL,它等于NULL,因此该行不会出现。在MySQL Documentation上查看有关运算符及其行为的更多详细信息。

解决方案1:您可以使用Ifnull()函数,检查从练习字段条件返回的NULL,并将其设置为FALSE

尝试以下操作:

SELECT * FROM learnbox 
WHERE learn_status=0 
  AND NOT IFNULL((practice_1 = 1 AND 
                  practice_2 = 1 AND 
                  practice_3 = 1)
                 , FALSE)

解决方案2:,您还可以使用空安全相等操作(<=>)。来自documentation

  

NULL安全等于。该运算符执行相等比较,例如   =运算符,但如果两个操作数均为1,则返回1而不是NULL   NULL,如果一个操作数为NULL,则为0,而不是NULL。

因此,对于练习字段条件,它将在此处返回 0

您也可以尝试以下操作:

SELECT * FROM learnbox 
WHERE learn_status = 0 
  AND NOT (practice_1 <=> 1 AND 
           practice_2 <=> 1 AND 
           practice_3 <=> 1)