Есть вопрос об агрегатной функции 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, чтобы получить правильный результат?