Rolf B: Lösung

Beitrag lesen

Hallo Linuchs,

es funktioniert für Dich und dann lassen wir es dabei. Es dürfte wohl auch tatsächlich schneller sein als eine correlated subquery oder ein self join.

Aber schau Dir mal CONCAT_WS an. Dieser Funktion übergibst Du das Trennzeichen als ersten Parameter und dann alle zu konkatenierenden Werte. Dann musst Du das '@' nicht ständig wiederholen.

Überlegung am Rande: Da Du die tag-Spalte im PHP wohl ohnehin in ein Date konvertieren musst, hättest Du die Wochentagbestimmung auch dort durchführen können. Aber es macht im SQL den Code auch nicht wirklich fetter...

Für die Nachwelt möchte ich aber sagen: Vorsicht damit.

  • Bei Linuchs ist die Chance hoch, dass die Daten kein @ enthalten, so dass der EXPLODE das Erwartete tut. Aber wehe, die Lösung wird anderswohin übertragen und eins der so eingesammelten Felder enthält doch mal ein @ Zeichen. Dieser CONCAT erzeugt eine Art CSV-String, und damit muss man immer aufpassen.
  • Die MIN Bildung funktioniert hier, weil tag und uhr feste Länge haben. Das Datum muss dafür Bei variabler Länge führt die Verkettung zu falschen oder unerwarteten Ergebnissen
  • An Stelle von CONCAT oder CONCAT_WS könnte man auch JSON_ARRAY nehmen (Ab Maria DB 10.2.3 oder MYSQL 8. Zumindest MariaDB kann ein MIN auf JSON-Werte bilden, und im PHP kann man sie dann auch wieder mit JSON_DECODE zerlegen.
  • Die effizienteste Lösung würde ich aber immer noch bei der ROW_NUMBER Idee suchen - vorbehaltlich eines Tests mit großen Datenmengen.

Rolf

--
sumpsi - posui - obstruxi