mysql: 'WHERE что-то! = true' исключает поля со значением NULL - PullRequest
2 голосов
/ 15 марта 2011

У меня есть 2 таблицы, одна, в которой у меня есть группы, другая, где я устанавливаю пользовательские ограничения, какие группы видны.Когда я выполняю LEFT JOIN и не указываю никаких условий, он показывает мне все записи.Когда я делаю WHERE group_hide.hide! = 'True', он показывает только те записи, для которых установлен ложный тип enum.С JOIN другие группы получают поле скрытия, установленное как «NULL».Как сделать так, чтобы он исключал только те из них, для которых установлено значение true, и отображал все остальное, имеющее значение NULL или false?

Ответы [ 3 ]

6 голосов
/ 15 марта 2011

В MySQL вы должны использовать IS NULL или IS NOT NULL при работе со значениями Nullable.

Вот вам стоит использовать (group_hide.hide IS NULL OR group_hide.hide != 'true')

1 голос
/ 15 марта 2011

Дон уже дал хороший ответ на вопрос, который вы задали, и решит вашу непосредственную проблему.

Однако позвольте мне обратиться к точке неправильного типа данных домена.Обычно вы делаете hide БУЛЕВЫМ, но mysql не реализует его полностью.Он преобразует его в TINYINT (1), который допускает значения от -128 до 127 (см. Обзор типов данных для mysql).Поскольку mysql не поддерживает ограничение CHECK, у вас остается возможность использовать триггер или стороннюю ссылку для правильного применения домена.

Ниже приведены проблемы с неправильной областью данных (ваш случай) в порядке важности:

  • Недостатки разрешения NULL для поля, которое может быть только 1 или 0, заключаются в том, что вам приходится использовать 3-значную логику (true, false, null), что, кстати, равноне совсем реализовано в SQL.Это делает определенные запросы более сложными и медленнее , чем они должны быть.Если вы можете сделать столбец NOT NULL, выполните.
  • Недостатками использования VARCHAR для поля, которое может быть только 1 или 0, является скорость запроса из-за дополнительного ввода-вывода и больших потребностей в памяти.(замедляет чтение, запись, увеличивает индексы, если поле является частью индекса и влияет на размер резервных копий; имейте в виду, что нет этих эффектов могут быть заметны при неправильном домене одиночное поле для таблиц размером меньшего размера , но если типы данных постоянно установлены слишком большими или если таблица имеет серьезное количество записей, эффекты будут кусаться).Кроме того, вам всегда нужно будет преобразовывать VARCHAR в 1 или 0, чтобы использовать естественные логические операторы mysql, увеличивающие сложность запросов.
  • Недостаток mysql, использующего TINYINT (1) для BOOL, состоит в том, что определенные значения допускаютсяСУБД, которые не должны быть разрешены, теоретически допускает сохранение в системе бессмысленных значений.В этом случае ваш прикладной уровень должен гарантировать целостность данных, и всегда лучше, если СУБД гарантирует целостность, поскольку она защитит вас от определенных ошибок на прикладном уровне, а также ошибок, которые могут быть допущены администратором базы данных.
0 голосов
/ 15 марта 2011

очевидный ответ будет:

WHERE (group_hide.hide is null or group_hide.hide ='false')

Я не совсем уверен, что такое правила нулевого поведения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...