/ / Uzyskiwanie pustych wyników dla zapytania "COUNT" / "GROUP BY" MySQL - mysql, sql, select, count, group-by

Uzyskiwanie pustych wyników dla zapytania "COUNT" / "GROUP BY" MySQL - mysql, sql, select, count, group-by

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 № 1

To nie jest błąd MySQL.

Zapytanie agregacyjne zwróci jeden wiersz na napotkaną grupę. Bez group byistnieje 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 byistnieje 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 NULLs 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