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?
Ja, dat kan.

(
Dan moet je SUM(aantal) gebruiken in SELECT, en pretparken.pretparkid uit GROUP BY halen.
Eventueel kan je SUM(aantal) DESC gebruiken in ORDER BY.
)
Oh shoot, ik had * geplaatst omdat het anders zoveel informatie zou worden, maar mijn query select op dit moment alleen "pretparken.pretparkid, pretparken.pretpark, ritten.datum, DATE_FORMAT(ritten.datum, "%d-%m-%Y") AS datum_formatted, COUNT(ritten.achtbaanid) AS count_achtbanen", m.a.w. ik doe al een COUNT, maar zodra ik de pretparkid uit de GROUP BY zou halen, krijg ik wel het juiste aantal, maar slechts één park ipv beide (of nog meer) parken.
misschien handig om je query even tussen code] tags te zetten en op goede plekken op Enter te drukken.
Daarmee wordt je query mogelijk wel leesbaar...

Je vroeg:
Zou het mogelijk zijn de query aan te passen zodat deze de waardes "meerdere parken" en "ritten opgeteld" bevat?

Logisch gezien kan je slechts het totaal aantal ritten geven:
- per park
- per dag
- per park per dag
Wil je het toch per dag, maar ook zien bij welke park(en) dat was, dan gebruik je GROUP_CONCAT(pretpark).
https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html#function_group-concat
Dank voor de tips tot dusver, morgen eerst eens kijken naar de versie van MySQL op m’n server, denk dat die nog te oud is, althans als ik snel kijk naar de links zie ik 8.0 staan, mag ik er dan van uitgaan dat het met v5 niet gaat lukken?
Top, dank Ivo, ik duik eens in de mogelijkheden.

[size=xsmall]Toevoeging op 22/02/2022 07:28:59:[/size]

Onderstaande levert precies dat wat ik zocht:

SELECT
  pretparken.pretparkid,
  pretparken.pretpark,
  ritten.datum,
  DATE_FORMAT(ritten.datum, "%d-%m-%Y") AS datum_formatted,
  COUNT(ritten.achtbaanid) AS count_achtbanen, 
  GROUP_CONCAT(DISTINCT(pretparken.pretpark)) AS pretparken
FROM ritten
INNER JOIN pretparken ON ritten.pretparkid=pretparken.pretparkid
GROUP BY ritten.datum
ORDER BY count_achtbanen DESC, ritten.datum ASC, pretparken.pretpark ASC
LIMIT 0,10


Hierbij is het resultaat van "pretparken" een komma gescheiden waarde met de betreffende pretparken.

[size=xsmall]Toevoeging op 22/02/2022 07:46:08:[/size]

Aangezien het goed mogelijk is dat er een komma in de naam van het pretpark zal zitten op den duur, heb ik ervoor gekozen een andere separator toe te passen en daarnaast heb ik een sortering toegevoegd:

GROUP_CONCAT(DISTINCT(pretparken.pretpark) ORDER BY pretpark ASC SEPARATOR "|") AS pretparken
maar als die query geen foutmelding geeft

welke naam krijg je dan naast die lijst met pretparken?

maw je groupby mist velden
Voor de volledigheid, op dit moment gebruik ik deze query en die geeft geen foutmelding:

SELECT
  GROUP_CONCAT(DISTINCT(pretparken.pretpark) ORDER BY pretpark ASC SEPARATOR "|") AS pretparken,
  ritten.datum,
  DATE_FORMAT(ritten.datum, "%d-%m-%Y") AS datum_formatted,
  COUNT(ritten.achtbaanid) AS count_achtbanen
FROM ritten
INNER JOIN pretparken ON ritten.pretparkid=pretparken.pretparkid
GROUP BY ritten.datum
ORDER BY count_achtbanen DESC, ritten.datum ASC
LIMIT 0,10


Je vraag is me dan ook niet duidelijk.

Reageren