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 (php)
PHP script in nieuw venster Selecteer het PHP script
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 (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT naam, aantal
FROM punten
GROUP BY naam

Deze query zal het volgende resultaat geven:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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 (php)
PHP script in nieuw venster Selecteer het PHP script
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 (php)
PHP script in nieuw venster Selecteer het PHP script
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.

« Lees de omschrijving en reacties

Inhoudsopgave

  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

PHP tutorial opties

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.