MySQL COUNT (DISTINCT ()) неожиданные результаты - PullRequest
3 голосов
/ 28 октября 2008

Я использую MySQL 5.0.45 на CentOS 5.1.

SELECT DISTINCT(email) FROM newsletter

Возвращает 217259 строк

SELECT COUNT(DISTINCT(email)) FROM newsletter

Возвращает 180698 за счет.

SELECT COUNT(*) FROM (SELECT DISTINCT(email) FROM newsletter) AS foo

Возвращает 180698 за счет.

Разве не все 3 запроса должны возвращать одно и то же значение?

Вот схема таблицы рассылки

CREATE TABLE `newsletter` (
  `newsID` int(11) NOT NULL auto_increment,
  `email` varchar(128) NOT NULL default '',
  `newsletter` varchar(8) NOT NULL default '',
  PRIMARY KEY  (`newsID`)
) ENGINE=MyISAM;

Обновление: Я обнаружил, что если я добавлю предложение WHERE в первый запрос, то получу правильные результаты. Предложение WHERE таково, что оно не повлияет на результаты.

SELECT DISTINCT(email) FROM newsletter WHERE newsID > 0

Ответы [ 5 ]

2 голосов
/ 28 октября 2008

Я предполагаю, что в столбце электронной почты есть несколько нулевых значений. Попробуйте

select count(*) from newsletter where email is null;
2 голосов
/ 28 октября 2008

Не могли бы вы пересечь различные результаты, чтобы увидеть, что такое дополнительные строки?

0 голосов
/ 28 октября 2008

Одним из возможных объяснений является то, что строки были удалены из таблицы между вашими двумя запросами. Но я предполагаю, что вы выполняли их несколько раз в разных порядках, поэтому сомневаюсь, что это так.

Какой счетчик строк вы получаете по этому запросу:

SELECT email FROM newsletter GROUP BY email;
0 голосов
/ 28 октября 2008

Да, как сказал Маглоб , вы можете получить NULL в своем столбце электронной почты. Попробуйте что-то вроде:

SELECT COUNT(COALESCE(email, 0)) FROM newsletter

Это даст вам ожидаемые результаты. Ой, подожди. Определение говорит, что электронная почта не принимает значения NULL. Если это действительно так, то это странно.

0 голосов
/ 28 октября 2008

В первом случае, что произойдет, если вы измените его на "select distinct(email) from newsletter order by email;"? Я не думаю, что это должно иметь значение, но это может.

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