Php Where条件下MySQL与NULL的比较

Php Where条件下MySQL与NULL的比较,php,mysql,Php,Mysql,我有一个MySql表结构如下:(用于英语句子学习系统): learn\u status列可以是0或1 ╔═════════════╦══════════════╦════════════╦════════════╦════════════╦════════╗ ║ sentence_id ║ learn_status ║ practice_1 ║ practice_2 ║ practice_3 ║ others ║ ╠═════════════╬══════════════╬═══════════

我有一个MySql表结构如下:(用于英语句子学习系统):

learn\u status列可以是
0
1

╔═════════════╦══════════════╦════════════╦════════════╦════════════╦════════╗
║ 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  ║
╚═════════════╩══════════════╩════════════╩════════════╩════════════╩════════╝
3实践列
可以是
NULL
-1
0
1

╔═════════════╦══════════════╦════════════╦════════════╦════════════╦════════╗
║ 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  ║
╚═════════════╩══════════════╩════════════╩════════════╩════════════╩════════╝
我想得到有两个条件的句子:

  • 了解\u状态应为0
  • 所有3个实践列不等于1
  • (如果practice_1=1和practice_2=1和practice_3=1同时,则应返回记录)

    (如果其中一个等于1,则可以,然后应返回记录)


    我使用下面的MySQL代码,但它不能正常工作:

    从learnbox中选择*,其中learn\u status=0,NOT(practice\u 1=1,practice\u 2=1,practice\u 3=1)
    

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

    但它只返回一个句子_id=(1和2),不能正常工作


    谢谢

    如果至少有一个操作数为
    NULL
    ,则比较运算符
    =
    将返回
    NULL
    。因此,对于
    语句\u id=3
    ,您将获得所有三个练习场条件的
    NULL

    而且,
    notnull
    NULL
    ;因此,对于
    语句_id=3
    ,您的Where条件将为
    TRUE和NULL
    ,这等于
    NULL
    ,因此该行不会出现。查看有关操作员及其行为的更多详细信息

    解决方案1:您可以使用函数,检查从实践字段条件返回的
    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:您还可以使用空安全相等操作(
    )。发件人:

    空安全相等。此运算符执行相等比较,如 =运算符,但如果两个操作数都为空,则返回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)
    
    从learnbox中选择*
    其中,学习状态=0
    而不是(练习1和1
    练习2和1
    实习3(1)
    
    如果至少有一个操作数为
    NULL
    ,则比较运算符
    =
    将返回
    NULL
    。因此,对于
    语句\u id=3
    ,您将获得所有三个练习场条件的
    NULL

    而且,
    notnull
    NULL
    ;因此,对于
    语句_id=3
    ,您的Where条件将为
    TRUE和NULL
    ,这等于
    NULL
    ,因此该行不会出现。查看有关操作员及其行为的更多详细信息

    解决方案1:您可以使用函数,检查从实践字段条件返回的
    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:您还可以使用空安全相等操作(
    )。发件人:

    空安全相等。此运算符执行相等比较,如 =运算符,但如果两个操作数都为空,则返回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)
    
    从learnbox中选择*
    其中,学习状态=0
    而不是(练习1和1
    练习2和1
    实习3(1)
    
    考虑修改您的模式。任何时候你都发现自己有列举的列(比如说,2),闹钟就应该响起来。考虑修改你的模式。任何时候,当你发现自己有列举的列(比如上面的2)时,警钟就会开始响起。