Michael Keller: MySQL order by nach eigenen Kriterien

Hallo,

Ich habe eine Tabelle, die unter anderem eine Spalte enthält, die durch einzelne Buchstaben die Zuordnung zu einer Gruppe angibt.

Wenn ich jetzt alle Zeilen ausgeben möchte, kann ich diese nach Gruppen ordnen. Dies geht aber nur in der alphabetischen (oder umgekehrten) Reihenfolge der Buchstaben, die den Gruppen entsprechen.

Ich möchte diese Sortierung aber selbst definieren. Gibt es eine Möglichkeit MySQL zu sagen, dass es nicht die Reihenfolge im Alphabet benutzen sollte, sondern meine eigene?

so etwas wie:
select id,gruppe from gruppen order by gruppen (H,A,Z,K)
?

mfg
Michael

  1. Hallo,

    Ich habe eine Tabelle, die unter anderem eine Spalte enthält, die durch einzelne Buchstaben die Zuordnung zu einer Gruppe angibt.

    [Sortierung nach Buchstabenspalte]

    Ich möchte diese Sortierung aber selbst definieren. Gibt es eine Möglichkeit MySQL zu sagen, dass es nicht die Reihenfolge im Alphabet benutzen sollte, sondern meine eigene?

    [...]

    Mir würde spontan, ohne tiefer in die Dokumentation von MySql einzutauchen, eine Translationstabelle einfallen, in der Du den Buchstaben Deiner Spalte entsprechende Buchstaben (je nach Typ der Spalte auch eine Zahl) zuweist, anhand derer Du dann eine Sortierung vornehmen kannst:

    translationtable
     -------
    | B | S |
    |-------|
    | H | A |
    | A | B |
    | Z | D |
    | K | E |
     -------

    Das würde zu folgende SQL-Anweisung führen:

    SELECT DISTINCT id, gruppe, S FROM gruppen LEFT JOIN translationtable ON gruppe = B ORDER BY S ASC

    Das sollte iirc und afaik immer dann dem selectierten Datensatz ein Wert aus der Spalte S zuordnen, wenn der Wert in Spalte gruppe einem Wert in Spalte B entspricht. Dann kannst Du ganz normal alphabetisch sortieren.

    Es gibt iirc und afaik noch eine Möglichkeit eigene Zeichensätze zu definieren, die MySQL zu Sortierung verwenden kann. Das gilt dann aber afaik für alle Datenbanken und wird vom entsprechenden Provider sicherlich nicht unterstützt werden. :)

    Gruß Alex

    --
    http://www.google.de/search?hl=de&safe=off&q=Rechtschreibung+Standart
    ss:) zu:} ls:} fo:| de:[ va:| ch:| sh:( n4:& rl:° br:& js:| ie:| fl:| mo:}
    1. Hallo Alex,

      Vielen Dank für die Idee - werde sie umsetzen!

      Es gibt iirc und afaik noch eine Möglichkeit eigene Zeichensätze zu definieren, die MySQL zu Sortierung verwenden kann. Das gilt dann aber afaik für alle Datenbanken und wird vom entsprechenden Provider sicherlich nicht unterstützt werden. :)

      die Idee kam mir auch.. aber hat halt schon einige recht bedeutsame Nachteile :)

      Gruss Michael

  2. Moin!

    Ich möchte diese Sortierung aber selbst definieren. Gibt es eine Möglichkeit MySQL zu sagen, dass es nicht die Reihenfolge im Alphabet benutzen sollte, sondern meine eigene?

    Typischer Fall von schlechtem Datenbank-Design. Hättest du nicht dieses so wichtige Sortierkriterium in den Datensätzen so gestalten können, dass die vorhandene Sortierfunktion damit arbeiten kann?

    so etwas wie:
    select id,gruppe from gruppen order by gruppen (H,A,Z,K)

    Willst du wirklich nur vier verschiedene existierende Kriterien irgendwie nett sortieren? Dann frage die Datenbank mehrfach ab, ggf. benutze auch UNION, um mehrere Einzel-Selects zusammenzufassen.

    Die Anregung von AlexBausW ist auch ganz nett, ich würde sie aber exakt anders herum realisieren (was bedeutet, dass eben das Datenbankdesign umgestellt werden müßte): In einer Tabelle sind das Merkmal und das Sortierkriterium gelistet, aber nicht das Merkmal steht im Datensatz, sondern das einfach sortierbare Sortierkriterum.

    Bei der Gelegenheit würde ich dann auch nicht Buchstaben verwenden, sondern Integer-Zahlen. Da hat man einfach mehr von, die Sortierung ist also feiner steuerbar.

    - Sven Rautenberg

    --
    Signatur oder nicht Signatur - das ist hier die Frage!
    1. Hallo Sven,

      Typischer Fall von schlechtem Datenbank-Design. Hättest du nicht dieses so wichtige Sortierkriterium in den Datensätzen so gestalten können, dass die vorhandene Sortierfunktion damit arbeiten kann?

      Wenn ich gewusst hätte, dass dieser Wunsch kommt hätte ich das sicher gemacht. Das Problem ist nur, dass die betroffene Seite längst online ist und mein Kunde jetzt einä Änderung möchte. Das ganze DB-Design zu ändern ist mir ein wenig zu aufwändig!

      Willst du wirklich nur vier verschiedene existierende Kriterien irgendwie nett sortieren? Dann frage die Datenbank mehrfach ab, ggf. benutze auch UNION, um mehrere Einzel-Selects zusammenzufassen.

      :) nei.. zu kleines Beispiel...

      Die Anregung von AlexBausW ist auch ganz nett, ich würde sie aber exakt anders herum realisieren (was bedeutet, dass eben das Datenbankdesign umgestellt werden müßte): In einer Tabelle sind das Merkmal und das Sortierkriterium gelistet, aber nicht das Merkmal steht im Datensatz, sondern das einfach sortierbare Sortierkriterum.

      Wie gesagt.. das hätte ich auch gemacht.. aber jetzt im Nachhinein ist es mir zu viel Arbeit :). Werde seinen Vorschlag umsetzen...

      Bei der Gelegenheit würde ich dann auch nicht Buchstaben verwenden, sondern Integer-Zahlen. Da hat man einfach mehr von, die Sortierung ist also feiner steuerbar.

      War sehr praktisch so (Dateien brauchen den Buchstaben als Teil ihres Names... war eifach zu schön.. so hab ichs halt so gemacht :)

      Gruss Michael