Я маю подібну проблему, що й проблема, опублікована тут: Як я можу отримати непорожній результуючий набір при використанні вибору, групування та підрахунку?
Проте, дане рішення повільніше, згадується відповідачем. Мені було цікаво, чи є альтернативне рішення без шкоди для продуктивності?
Крім того, я не розумію, чому запит на зразок:
SELECT
`a`, `b`, COUNT(*) as `c`
FROM `mytable`
WHERE `status` = 1
GROUP BY `a`,`b`
поверне порожній результат, якщо тільки без частини "GROUP BY" він показує очікуваний результат з 0 як значення підрахунку? Чи може це бути можлива помилка mysql?
Я також знайшов дискусію на порталі помилок mysql, з подібною проблемою, тут: http://bugs.mysql.com/bug.php?id=26087
Але ця дискусія недостатньо зріла, щоб отримати відповідну відповідь.
Мої запитання:
- Чи може це бути можлива помилка mysql?
- Чи можна мати краще альтернативне рішення, ніж дане (посилання на початку)? Якщо так, то як?
Відповіді:
2 для відповіді № 1Це не помилка MySQL.
Запит агрегації повертає один рядок на групу. Без a group by
, є одна група - вся таблиця. Я визнаю, що це трохи складніше, тому що є ще одна група, навіть якщо в таблиці немає рядків.
З group by
, є один рядок на групу. Якщо в групі немає рядків, група не з'являється. У вашому випадку запит:
SELECT `a`, `b`, COUNT(*) as `c`
FROM `mytable`
WHERE `status` = 1
Повернеться один рядок, з двома NULL
слідом за ними 0
.
Той самий запит із:
GROUP BY `a`,`b`
не буде повертати жодних рядків, оскільки немає рядків для формування груп.
0 для відповіді № 2
Насправді, це не помилка MySQL. Але ви можете визначити похідну таблицю, а потім порахувати її результати.
SELECT
`a`, `b`, COUNT(*) as `c`
FROM ( SELECT `a`, `b`
FROM `mytable`
WHERE `status` = 1
GROUP BY `a`,`b`) t