GROUP BY: Het juiste gebruik ervan

  1. Inleiding
  2. Uitleg GROUP BY en gebruikte basisgegevens
  3. Fout gebruik van de GROUP BY clausule
  4. GROUP BY en verzamelingsfuncties
  5. Groeperen op meerdere kolommen
  6. GROUP BY en HAVING
  7. GROUP BY Modifiers
  8. Slotwoord en referenties
  9. Reacties op deze tutorial

Fout gebruik van de GROUP BY clausule

Zoals ik in de inleiding al vermelde, gebruiken veel mensen de GROUP BY clausule op een verkeerde manier. In de meeste gevallen wordt deze clausule gebruikt om unieke resultaten te tonen.

Allereerst nogmaals de basisgegevens die ik gebruik:
Code
1
2
3
4
5
6
7
8
9
10
11
12
+----+-------+--------+------------+
| id | naam  | aantal | datum      |
+----+-------+--------+------------+
| 1  | Piet  | 115    | 2007-07-11 |
| 2  | Karel | 230    | 2007-07-11 |
| 3  | Piet  | 45     | 2007-07-11 |
| 4  | Kees  | 135    | 2007-07-11 |
| 5  | Tom   | 190    | 2007-07-12 |
| 6  | Karel | 150    | 2007-07-12 |
| 7  | Kees  | 30     | 2007-07-12 |
| 8  | Piet  | 90     | 2007-07-12 |
+----+-------+--------+------------+


Voorbeeld 1: Fout gebruik GROUP BY
Code
1
2
3
SELECT naam, aantal
FROM punten
GROUP BY naam

Deze query zal het volgende resultaat geven:
Code
1
2
3
4
5
6
7
8
+-------+--------+
| naam  | aantal |
+-------+--------+
| Karel | 230    |
| Kees  | 135    |
| Piet  | 115    |
| Tom   | 190    |
+-------+--------+

Nu lijkt het erop dat er inderdaad unieke gegevens getoond worden, maar in werkelijkheid is er iets anders gebeurd. De GROUP BY heeft gezorgd dat de resultaat gegroepeerd zijn op naam, dat wil zeggen dat alle records met dezelfde naam samengenomen zijn en getoond worden.

Het probleem is nu dat MySQL niet in staat is om deze groep in 1 record weer te geven. Het gevolg is dat MySQL 1 willekeurig record uit de groep kiest en weergeeft. Met de rest van de records uit die groep kun je nu niets meer beginnen.

Dit zal ik aantonen door de resultaten op het aantal punten te sorteren. Ik wil dat het aantal punten oplopend gesorteerd wordt.

Voorbeeld 2: Sorteren van de gegevens
Code
1
2
3
4
SELECT naam, aantal
FROM punten
GROUP BY naam
ORDER BY aantal

Wat ik nu dus verwacht is dat elke naam maar 1 keer weergegeven wordt en dat tevens het laagste puntenaantal bij die naam getoond wordt. Maar dat is niet het resulaat:
Code
1
2
3
4
5
6
7
8
+-------+--------+
| naam  | aantal |
+-------+--------+
| Piet  | 115    |
| Kees  | 135    |
| Tom   | 190    |
| Karel | 230    |
+-------+--------+

Enkel het eerder verkregen resultaat is gesorteerd op het aantal punten. De 150 punten van bijvoorbeeld Karel zien we jammergenoeg nergens meer terug. Dit toont aan dat MySQL gewoon een willekeurig record uit de groep toont en de resutlaten dus niet betrouwbaar zijn.

Vorige Volgende