2013-09-12 5 views
3

Я запускаю CodeIgniter, используя активные записи. Ниже моя структура таблицы:Активная запись Codeigniter, где не работает

id (int) user (int) is_complete (tinyint) 
------------------------------------------------ 
1   24   1 
2   24   1 
3   24   NULL 
4   24   0 
5   24   0 

Случай 1

$this->db->where('user', 24); 

Запрос:

SELECT * FROM `table` WHERE `user` = 24 

Работы и возвращает:

id user is_complete 
-------------------------- 
1 24  1 
2 24  1 
3 24  NULL 
4 24  0 
5 24  0 

Случай 2

$this->db->where('user', 24); 
$this->db->where('is_complete', 1); 

Запрос:

SELECT * FROM `table` WHERE `user` = 24 AND `is_complete` = 1 

Работы и возвращает:

id user is_complete 
-------------------------- 
1 24  1 
2 24  1 

Случай 3

$this->db->where('user', 24); 
$this->db->where('is_complete !=', 1); 

Запрос:

SELECT * FROM `table` WHERE `user` = 24 AND `is_complete` != 1 

Не работает и возвращается:

id user is_complete 
-------------------------- 
4 24  0 
5 24  0 

Случай 4

$this->db->where('user', 24); 
$this->db->where('is_complete <>', 1); 

Запрос:

SELECT * FROM `table` WHERE `user` = 24 AND `is_complete` <> 1 

Не работает и возвращается:

id user is_complete 
-------------------------- 
4 24  0 
5 24  0 

Результат Необходимое

Это должно возвращение:

id user is_complete 
-------------------------- 
3 24  NULL 
4 24  0 
5 24  0 

Я делаю что-то неправильно с помощью метода where(), или есть лучший способ сделать это?

+0

, и если вы сравниваете его с '0' или' NULL' - вы получаете желаемый результат? –

+0

'0' не работает,' NULL' делает работу – doitlikejustin

+0

** Исправление **: '0' действительно работает,' NULL' работает – doitlikejustin

ответ

6

Это проблема на уровне базы данных, хотя она не является ошибкой - так работает SQL с нулевыми значениями. Этот запрос:

SELECT 
    * 
FROM 
    `table` 
WHERE 
    `user` = 24 AND `is_complete` != 1 

будет возвращать записи, где is_complete не равен 1, но не нулевой. Если вы хотите включить нулевые записи, а также, что вам нужно будет сделать это:

SELECT 
    * 
FROM 
    `table` 
WHERE 
    `user` = 24 AND 
    (`is_complete` != 1 OR `is_complete` IS NULL) 

Сравнивая столбец с ненулевым значением, вы автоматически исключенные аннулирует, которые должны быть обработаны с другим синтаксис.

Вам нужно будет добавить дополнительное предложение в скобках для запроса; see here for how.

+0

Итак, если' is_complete' также имеет значения '2' и '3', я бы использовал тот же синтаксис, который вы предоставили? Потому что '! = 1' позаботится о ВСЕХ значениях (0,2,3), кроме' NULL', а 'IS NULL' обрабатывает любые значения NULL? – doitlikejustin

+0

Да, это правильно ':)'. «Не равно» будет работать над любыми реальными значениями, кроме нуля. – halfer

+0

Удивительный! Просто попробовал и работал точно так, как я хочу, я использовал заключенное в скобки 'where()' предложение, и это тоже сработало. Спасибо – doitlikejustin

1

Дело 3 работает. NULL отличается от SQL числом и требует другого компаратора. Я думаю, что NULL - это отсутствие чего-либо, а 0 - число 0; это тонкая разница. Таким образом, != 1 дает все номера, кроме 1, тогда как для поиска нулевого значения вы должны использовать компаратор /is not null.

Запрос, чтобы найти вас требуется результат:

$this->db->where("((is_complete = 0) OR (is_complete is null))",NULL,FALSE); 

Поиск != 1 не то же самое, что и поиск = 0. (Если возможно, то is_complete имеет значение, которое называется «3». Если вы ищете то, что хотите, вы можете получить меньше проблем, а вместо того, что не должно быть там).

Оператор where ожидает второй параметр, если используется третий (FALSE) параметр для удаления обратных циклов.

0

Всегда лучше использовать активные записи для поддержки нескольких баз данных.

Вы можете использовать активные записи, как, что для запроса

Случай 3

$this->db->where('user', 24, FALSE); 
$this->db->where('is_complete !=', 1, FALSE); 

Случай 4

$this->db->where('user', 24, FALSE); 
$this->db->where('is_complete <>', 1, FALSE); 

Третий параметр используется для снятия задней клеща, который вызывает проблему с sql-запросом.

Смежные вопросы