我有一个像这样的MySql表结构:(用于英语句子学习系统):
learn_status column
可以是0
或1
。
3 practices columns
可以是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 ║
╚═════════════╩══════════════╩════════════╩════════════╩════════════╩════════╝
我想获得具有2个条件的句子:
(如果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)并且不能正常工作。
谢谢
答案 0 :(得分:2)
如果操作数中至少一个是=
,则比较运算符NULL
将返回NULL
。因此,对于sentence_id = 3
,您将在所有三个练习场条件下获得NULL
。
此外,NOT NULL
是NULL
;因此对于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)