Есть вопрос об агрегатной функции MySQL COUNT (), который время от времени возникает у меня в голове. Я хотел бы получить объяснение, почему он работает именно так.
Когда я начал работать с MySQL, я быстро понял, что его COUNT (условие), кажется, работает правильно, только если условие также содержит в конце OR NULL. В случае более сложных условий COUNT выяснение того, где именно его поставить, было эмпирическим процессом. В MSSQL вам не нужно это OR NULL для получения правильных результатов, поэтому я хотел бы знать его объяснение. Итак, вот пример.
Давайте иметь очень простую таблицу со следующей структурой и данными:
CREATE TABLE test (
`value` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
INSERT INTO test (value) VALUES(1);
INSERT INTO test (value) VALUES(4);
INSERT INTO test (value) VALUES(5);
INSERT INTO test (value) VALUES(6);
INSERT INTO test (value) VALUES(4);
INSERT INTO test (value) VALUES(4);
INSERT INTO test (value) VALUES(5);
INSERT INTO test (value) VALUES(2);
INSERT INTO test (value) VALUES(8);
INSERT INTO test (value) VALUES(1);
Сценарий: я хотел бы подсчитать, сколько строк у меня есть, где значение = 4. Очевидным решением было бы отфильтруйте его с помощью WHERE и сделайте COUNT (*), но меня интересует решение на основе COUNT (условие).
Итак, решение, которое приходит мне в голову:
SELECT COUNT(value=4)
FROM test
Результат - 10. Это явно неверно.
Вторая попытка с OR NULL:
SELECT COUNT(value=4 OR NULL)
FROM test
Результат - 3. Это верно.
Кто-нибудь может объяснить логику этого? Это какая-то ошибка MySQL или есть логическое объяснение, почему мне нужно добавить это странно выглядящее OR NULL в конец условия COUNT, чтобы получить правильный результат?