Php Where条件下MySQL与NULL的比较
我有一个MySql表结构如下:(用于英语句子学习系统):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 ║ ╠═════════════╬══════════════╬═══════════
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)时,警钟就会开始响起。