MySQL Sortierung bei GROUP_CONCAT und FIND_IN_SET

Hey!

Ich habe wieder mal ein kleines Problem mit MySQL – wieder mit der Leichtathletik-Datenbank, die ich betreue. Folgendes:

Es gibt Einzelergebnisse und es gibt Mannschaftsergebnisse. Es gibt eine Tabelle ergebnisse, die bis heute folgende Spalten hatte: id, altersklassenkuerzel, altersklassenkuerzel1, disziplinkuerzel, ergebnis, sportlerkuerzel, sportlerkuerzel1, sportlerkuerzel2, sportlerkuerzel3, sportlerkuerzel4, ort, tag.

Wenn jetzt mehr als ein Athlet gestartet ist, bspw bei einer Staffel, dann habe ich die Kürzel der Sportler in die ersten vier sportlerkuerzel-Spalten geschrieben. Jetzt ist aber der Fall aufgetreten, dass bei einem Wettkampf eine Mannschaft aus acht Sportlern besteht. Ich hätte hier also noch drei Spalten hinzufügen müssen, die meist leer sind. Da habe ich mir gedacht, ich lösche alle Sportlerkuerzel-Spalten bis auf eine, und schreibe da, wenn es eine Mannschaftsdisziplin ist, die Kürzel der Sportler in einer Kommaseparierten Liste rein.

Soweit so gut, klappt auch alles. Mein SQL-Code, der das Ganze ausliest, sieht so aus (vereinfacht, alles meiner Meinung nach unwichtige rausgelöscht):

[PHP]
SELECT ergebnisse.akuerzel, ergebnisse.dkuerzel, ergebnisse.ergebnis, ergebnisse.ort, ergebnisse.tag, ergebnisse.monat, GROUP_CONCAT(athleten.athlet SEPARATOR ‚
‘) athlet, CAST(ergebnis AS DECIMAL(12,6)) as ergebnis_nummer FROM ergebnisse
INNER JOIN athleten ON FIND_IN_SET(athleten.skuerzel, ergebnisse.skuerzel) > 0
WHERE jahr=‚14‘ AND meisterschaft !=‚‘
GROUP BY ergebnisse.id[/PHP]

Die vollen Namen der Athleten werden durch den INNER JOIN aus der Tabelle athleten gezogen und mit dem
-Tag als Trennzeichen in die Spalte athlet eingefügt.

Jetzt das Problem: Die Sortierung der Namen in der Spalte athlet entspricht nicht der Reihenfolge der durch Komma getrennten Kürzel in der Spalte skuerzel in der Tabelle ergebnisse.

Wie kann ich also das Ergebnis der INNER JOIN in der Reihenfolge ausgeben, wie die Kürzel in der Spalte ergebnisse.skuerzel stehen?

Vielen Dank schon mal!

GROUP_CONCAT(athleten.athlet SEPARATOR '<br>' ORDER BY ergebnisse.skuerzel ASC) athlet

http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat

Hi Threadi,

danke für deine Antwort. Wenn ich das so einbaue, dann funktioniert das leider nicht ganz. Die Sortierung scheint dann immer noch danach zu gehen, wann/wo die Kürzel der teilnehmenden Athleten in der Tabelle aller Athleten gefunden werden und nicht nach der Reihenfolge, wie sie in der Ergebnis-Tabelle drin stehen …

Hat vielleicht jemand einen Vorschlag, wie man das anders lösen kann, wenn das mit der Sortierung nicht möglich ist? Also den Join der einzelnen Sportlerkürzel mit den entsprechenden EInträgen in der Sportler-Tabelle, sodass die Reihenfolge unverändert bleibt?

Hast du in der Tabelle ids angelegt?
[INDENT]1 – Sportler1 – … – … – …
2 – Sportler2 – … – … – …[/INDENT]
Darüber könntest du den ORDER BY wie gewünscht nutzen.

Nein, in der Sportler-Tabelle sind die Kürzel die ids … Aber ich möchte die Sortierung ja auch nicht wie in der Sportler-Tabelle machen, sondern wie in der Spalte in der Ergebnis-Tabelle mit den verschiedenen Kürzeln.

Hier mal ein Schema der Tabellen:

ergebnisse

id | akuerzel | akuerzel1 | dkuerzel | ergebnis | skuerzel | ort | tag | monat | jahr | vereinsrekord | nur_meisterschaft | meisterschaft | platzierung

athleten

skuerzel | athlet | jahrgang

Und in der Spalte ergebnisse.skuerzel können jetzt eventuell mehrere Sportler-Kürzel stehen, getrennt durch Kommata. Und diese möchte ich eintauschen gegen den Inhalt der Spalte athleten.athlet, die die entsprechenden skuerzel-Einträge haben. Aber die Reihenfolge soll so bleiben, wie die kommaseparierte Liste in der Spalte ergebnisse.skuerzel das vorgibt.

Oh sorry, hab nicht aufmerksam gelesen :oops:

Ich habe leider keinen Plan…

Subselect wäre evtl. auch eine Möglichkeit.

Hey!

Danke für den Denkanstoß. Ich werde es jetzt evtl mal so versuchen, dass ich die Komma-Liste erst nachher mit PHP zerlege und dann mit einer Schleife die Namen einzeln aus der Tabelle hole. Das ist zwar vermutlich nicht sehr effizient, aber in dem Fall geht das, da ich das Ergebnis dann statisch nutze und der Endanwender gar nicht auf die Seite mit der Abfrage kommt.