Een tijd geleden postte ik het volgende: https://www.phphulp.nl/php/forum/topic/database-model/102835/

Inmiddels is dit project flink uitgebreid, maar de basis is hetzelfde:

- pretparken: pretparkid, pretpark
- achtbanen: achtbaanid, achtbaan
- ritten: ritid, achtbaanid, pretparkid, datum, aantal

Het dashboard heeft een aantal milestones waaronder "meeste achtbanen op één dag" en "Meeste ritten op één dag". Nu komt het (heel sporadisch) wel eens voor dat we meerdere parken op één dag bezoeken. Deze zou ik dan samen willen voegen. Op dit moment doe ik dat zo:

SELECT *
FROM ritten
INNER JOIN pretparken ON ritten.pretparkid=pretparken.pretparkid
GROUP BY ritten.datum, pretparken.pretparkid
ORDER BY count_achtbanen DESC, ritten.datum ASC, pretparken.pretpark ASC LIMIT 0,10;


Dit levert een lijst met de 10 dagen waarop we de meeste verschillende achtbanen bereden, maar gaat daarbij voorbij aan dagen waarop we 7 achtbanen in het ene en 3 achtbanen in het andere park deden, waardoor deze dag mogelijk in de top 10 zou kunnen komen.

Zou het mogelijk zijn de query aan te passen zodat deze de waardes "meerdere parken" en "ritten opgeteld" bevat?
Dit is natuurlijk een andere query:
de vorige query die je postte, bevat de regels.


SELECT
  pretparken.pretparkid,
  pretparken.pretpark,


En dat gaat dan niet goed
Daar heb je gelijk in, die waardes gaven echter geen problemen. Ze waren overbodig en leverden in feite gewoon één van de resultaten op die ook in het gegroepeerde resultaat staan.
Veur Heur op 22/02/2022 16:09:28

Daar heb je gelijk in, die waardes gaven echter geen problemen. Ze waren overbodig en leverden in feite gewoon één van de resultaten op die ook in het gegroepeerde resultaat staan.


Ja, maar dat is dus een zinloos resultaat: je krijgt er 1. Welke weet je niet en is afhankelijk van bijvoorbeeld de volgorde van invoeren. (van de ritten of van de parken?)

En in deze is het een telling die betrekking heeft op alle ritten in die parken, dus ook op al die parken.

In de tutorial sectie op phphulp staat een voorbeeld van een MAX(). (prijs) daarbij wordt ook een willekeurige naam getoond, maar die heeft geen betrekking op de max-prijs.

Helaas accepteert MySQL dit soort query's onder het mom: beter een resultaat geven dat ongeveer klopt en mogelijk is wat de gebruiker nodig had, dan een foutmelding.

Gelukkig kun je dat gedrag afdwingen middels ONLY_FULL_GROUP_BY

https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
en
https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html

De pagina over versie 5.7 meldt nog:
(Before 5.7.5, MySQL does not detect functional dependency and ONLY_FULL_GROUP_BY is not enabled by default.


Op die pagina wordt ook middels een voorbeeld precies het probleem beschreven met jouw pretparknaam. Dat is in dat voorbeeld "abc"

Speel die query's maar eens na. En zeker als je speelt met het stuk WHERE, zul je zien dat er gekke resultaten uit kunnen komen.

Daarmee zou je zo maar kunnen denken dat je 100 ritten in de Efteling deed, terwijl dat er maar 1 was en de andere 99 verdeeld over Walibi en Plopsa waren.

Voor deze query is het niet van belang waar de ritten waren, ik ben op zoek naar het totaal van de dag en niet het totaal per pretpark. Door GROUP_CONCAT weet ik echter wél welke parken betrekking hebben op de dag, alleen niet hoeveel per park, maar die informatie heb ik niet nodig.
Fijn dat het gelukt is met GROUP_CONCAT().

Reageren