Mam podobny problem jak opublikowany tutaj problem: W jaki sposób mogę uzyskać niepusty wynik końcowy przy wyborze, grupowaniu według i zliczaniu?
Jednak podane rozwiązanie jest wolniejsze, o czym wspomina rzecznik. Zastanawiam się tylko, czy istnieje jakieś alternatywne rozwiązanie bez kompromisu w wydajności?
Ponadto nie rozumiem, dlaczego zapytanie takie jak:
SELECT
`a`, `b`, COUNT(*) as `c`
FROM `mytable`
WHERE `status` = 1
GROUP BY `a`,`b`
zwróci pusty wynik, gdzie tylko bez części "GROUP BY" pokazuje oczekiwany wynik z 0 jako wartością zliczenia? Czy to może być możliwy błąd mysql?
Znalazłem również dyskusję na temat mysql bug portal z podobnym problemem, tutaj: http://bugs.mysql.com/bug.php?id=26087
Ale ta dyskusja nie jest wystarczająco dojrzała, aby uzyskać odpowiednią odpowiedź, tak myślę.
Moje pytania:
- Czy to może być możliwy błąd mysql?
- Czy można mieć lepsze rozwiązanie alternatywne niż podane (link na początku)? Jeśli tak, w jaki sposób?
Odpowiedzi:
2 dla odpowiedzi № 1To nie jest błąd MySQL.
Zapytanie agregacyjne zwróci jeden wiersz na napotkaną grupę. Bez group by
istnieje jedna grupa - cały stół. Przyznaję, że jest to trochę trudne, ponieważ wciąż istnieje jedna grupa, nawet jeśli w tabeli nie ma żadnych wierszy.
Z a group by
istnieje jeden wiersz na grupę. Jeśli w grupie nie ma żadnych wierszy, grupa nie zostanie wyświetlona. W twoim przypadku zapytanie:
SELECT `a`, `b`, COUNT(*) as `c`
FROM `mytable`
WHERE `status` = 1
Zwróci jeden wiersz z dwoma NULL
s za nim 0
.
To samo zapytanie z:
GROUP BY `a`,`b`
nie zwróci wierszy, ponieważ nie ma wierszy do utworzenia grup.
0 dla odpowiedzi nr 2
W rzeczywistości nie jest to błąd MySQL, ale możesz najpierw zdefiniować wyprowadzoną tabelę, a następnie policzyć jej wyniki.Myślę, że to zachowanie wynika z hierarchii operacji MySQL.
SELECT
`a`, `b`, COUNT(*) as `c`
FROM ( SELECT `a`, `b`
FROM `mytable`
WHERE `status` = 1
GROUP BY `a`,`b`) t