У меня есть табличная структура MySql, как это: (для системы обучения английскому Sentence):
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 ║
╚═════════════╩══════════════╩════════════╩════════════╩════════════╩════════╝
Я хочу получить предложения с двумя условиями:
(если 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 записи вышеприведенной таблицы: sentence_id = (1 & 2 & 3) записи.
но он возвращает единственное предложение_прямое = (1 & 2) и работает неправильно.
Спасибо
Оператор сравнения =
возвращает NULL
если по крайней мере один из операндов равен NULL
. Таким образом, для sentence_id = 3
вы получаете NULL
для всех трех полевых условий.
Кроме того, NOT NULL
NULL
; таким образом, для sentence_id = 3
, ваше условие Where будет TRUE AND NULL
, равное NULL
, поэтому строка не появляется. Узнайте больше об операторах и их поведении в документации MySQL.
Решение 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. Вы также можете использовать нулевую безопасную работу (<=>
). Из документации:
NULL-безопасный. Этот оператор выполняет сравнение равенства, как оператор =, но возвращает 1, а не NULL, если оба операнда NULL, а 0, а не NULL, если один операнд равен NULL.
Таким образом, он будет возвращаться здесь 0 для практических полевых условий.
Вы также можете попробовать следующее:
SELECT * FROM learnbox
WHERE learn_status = 0
AND NOT (practice_1 <=> 1 AND
practice_2 <=> 1 AND
practice_3 <=> 1)