SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 24.01.2008 19:53:40

_Lok_
Участник
Зарегистрирован: 24.01.2008
Сообщений: 4

Воарос на засыпку

MySQL запросы к таблице user_search:

SELECT COUNT(*) FROM user_search WHERE search_in = 1 AND ((birthday<=NOW()-INTERVAL 18 YEAR));
результат: 40850

SELECT COUNT(*) FROM user_search WHERE search_in = 1;
результат: 40951

SELECT COUNT(*) FROM user_search WHERE search_in = 1 AND (NOT(birthday<=NOW()-INTERVAL 18 YEAR));
результат: 0
Необходимо объяснить что содержиться в 40951-40850 рядах и почему они не попали не под первое, не под третье условие.

Может это как то с типами данных в MySQL связано?!

Неактивен

 

#2 24.01.2008 21:26:12

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Воарос на засыпку

Совершенно верно. Всё дело в типах данных. Подозреваю, что birthday у Вас целочисленный тип.

Попробуйте выполнить запросы
SELECT COUNT(*) FROM user_search WHERE search_in = 1 AND ((birthday<=NOW()-INTERVAL 1800 YEAR));
и
SELECT COUNT(*) FROM user_search WHERE search_in = 1 AND (birthday<=NOW());

и посмотрите на результат, он будет одинаков - 40850.
Для правильной работы используйте функцию year().

Неактивен

 

#3 24.01.2008 21:41:33

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Воарос на засыпку

Возможно в birthday NULL. Любая операция с NULL есть NULL.

А вообще SELECT DISTINCT (birthday<=NOW()) from search_in; вам поможет понять

Неактивен

 

#4 24.01.2008 22:04:32

_Lok_
Участник
Зарегистрирован: 24.01.2008
Сообщений: 4

Re: Воарос на засыпку

vasya написал:

Совершенно верно. Всё дело в типах данных. Подозреваю, что birthday у Вас целочисленный тип.

Попробуйте выполнить запросы
SELECT COUNT(*) FROM user_search WHERE search_in = 1 AND ((birthday<=NOW()-INTERVAL 1800 YEAR));
и
SELECT COUNT(*) FROM user_search WHERE search_in = 1 AND (birthday<=NOW());

и посмотрите на результат, он будет одинаков - 40850.
Для правильной работы используйте функцию year().

нет, birthday: DATE

Неактивен

 

#5 25.01.2008 01:41:59

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Воарос на засыпку

Тогда причина (как Вам уже указал rgbeast) в NULL значениях. Выполните

SELECT count(*) FROM user_search WHERE search_in = 1 AND birthday IS NULL;

Как раз и должна получиться искомая разница.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson