Andrea: ORDER BY

Hallo liebes Forum,

ich habe eine DB (mysql 5) mit folgenden Daten in der Spalte x:

x
-------
0-120 V
0-15 V
0-300 V
0-35 V
0-70 V

SELECT x FROM tabelle ORDER BY x
mit (oder ohne DESC)

Möchte über die Spalte x sortieren.
Leider stimmt die Sortierung nicht vom "Sinn" her.
Ich hätte gern:

x
-------
0-15 V
0-35 V
0-70 V
0-120 V
0-300 V

Gibt es eine Möglichkeit, damit ich mein gewünschtes Ergebnis bekomme???

  1. Gibt es eine Möglichkeit, damit ich mein gewünschtes Ergebnis bekomme???

    Da musst Du mit den Stringfunktionen Deines RDBMS an. Also nach dem ausgewerteten String sortieren.

    1. Verstehe leider kein Wort ;-(

      1. Verstehe leider kein Wort ;-(

        weiß zwar auch nicht wie Hamstar das meint, aber wie wär der Vorschlag:

        x

        0-15 V
        0-35 V
        0-70 V
        0-120 V
        0-300 V

        Wenn Du direkt die numerischen Werte in 2 weitere Felder kopierst,

        also:

        x         y    z
        -----------------
        [0-15 V] [0] [15]

        dann kannst Du anschließend "ORDER BY y,z" verwenden.

        So müßte die Sortierung stimmen.

        Schönen Gruß,
        Semaphor

      2. echo $begrüßung;

        Verstehe leider kein Wort ;-(

        Du sollst den relevanten Teil des Suchbegriffs mittels geeigneter Stringfunktionen ermitteln. Du möchtest ja sicherlich den Teil der nach dem Bindestrich beginnt haben. Das Ergebnis solltest du in einen numerischen Wert überführen (casten) und danach kannst du sortieren.
        Sollte auch der Teil vor dem Bindestrich für die Sortierung elevant sein, könntest du erst diesen ermitteln und danach sortieren lassen, dann mit dem zweiten Teil fortfahren.

        echo "$verabschiedung $name";

      3. Verstehe leider kein Wort ;-(

        Aber immerhin verstehst Du SQL und die ORDER BY-Klausel.

        Was möchtest Du also, Du möchtest nach dem numerischen Wert eines in einer Zeichenkette verborgene Teil-Zeichenkette sortieren.

        Dafür musst Du:

        • die Zeichenkette auseinanderhacken (also bspw. die ersten 5 Zeichen wegbeissen)
        • die übriggebliebene Teilzeichenkette in einen numerischen Wert umwandeln nach dem numerisch sortiert werden kann

        Wie Du das genau machst bleibt Dir überlassen.

        Also fang mal an mit dem Zerhacken und Umwandeln.

        Wie in der Küche!   ;)

  2. Hallo Andrea,

    x

    0-120 V
    0-15 V
    0-300 V
    0-35 V
    0-70 V

    wenn Du so sortieren möchtest, wie Du das angibst (und es ist einleuchtend, dass man so sortieren möchte), so ist grundsätzlich die Struktur der Tabelle ungünstig gewählt. Diese Spalte enthält gleich drei Informationen:

    - Untergrenze
      - Obergrenze
      - Einheit

    SELECT x FROM tabelle ORDER BY x
    mit (oder ohne DESC)

    Möchte über die Spalte x sortieren.

    ich verstehe Dich so, dass Du über die Obergrenze sortieren möchtest.

    Ich hätte gern:
    x

    0-15 V
    0-35 V
    0-70 V
    0-120 V
    0-300 V

    Gibt es eine Möglichkeit, damit ich mein gewünschtes Ergebnis bekomme???

    Ja, wie Hamstar bereits schrieb, solltest Du mit den Zeichenketten-Funktionen Deines Datenbankmanagementsystems und der CAST-Funktion zum Ziel kommen.

    Da Du darauf mit "Verstehe leider kein Wort ;-(" antwortetest, vermute ich, dass Du noch Anfängerin bist. Dies vermute ich für den Umgang mit Datenbanken, dies vermute ich ebenso für den Umgang mit Programmiersprachen.

    Nach den von Dir aufgeführten Beispielen bieten sich verschiedene Vorgehensweisen an, zum Beispiel:

    1. Suche in der Spalte die Zeichenkette, die die Obergrenze bildet.
       Dazu kannst Du z.B. SUBSTRING_INDEX() nutzen.

    2. Wandle diese Zeichenkette mit CAST (s.o.) in eine Zahl um, denn Du
       möchtest ja nach dem Wert der Obergrenze sortieren.

    SUBSTRING_INDEX(x, ' ', 1) liefert Dir alles bis zum ersten Leerzeichen (hinter der Obergrenze)

    x       |SUBSTRING_INDEX(x, ' ', 1)|
    --------|--------------------------|
    0-15 V  |0-15                      |
    0-35 V  |0-35                      |
    0-70 V  |0-70                      |
    0-120 V |0-120                     |
    0-300 V |0-300                     |

    Nun schneiden wir noch die Untergrenze und den Bindestrich weg. Dazu nutzen wir wiederum SUBSTRING_INDEX, diesmal mit Trennzeichen '-' und dem Index -1, weil wir an allem _rechts_ vom Trennzeichen interessiert sind. Wir füttern die Funktion mit dem Ausdruck aus dem ersten Schritt.

    x       |SUBSTRING_INDEX(x,' ', 1)|SUBSTRING(SUBSTRING_INDEX(x,' ', 1),'-',-1)
    --------|-------------------------|-----------------------------------
    0-15 V  |0-15                     |15
    0-35 V  |0-35                     |35
    0-70 V  |0-70                     |70
    0-120 V |0-120                    |120
    0-300 V |0-300                    |300

    Im letzten Schritt wandeln wir das Ergebnis in eine Zahl um, ich gehe davon aus, dass es nur ganzzahlige Obergrenzen gibt :-)

    x       |CAST(SUBSTRING(SUBSTRING_INDEX(x,' ', 1),'-',-1) AS INTEGER)
    --------|------------------------------------------------------------
    0-15 V  |15
    0-35 V  |35
    0-70 V  |70
    0-120 V |120
    0-300 V |300

    Somit kannst Du Dein Statement schreiben zu

    SELECT x  
    FROM tabelle  
    ORDER BY CAST(SUBSTRING(SUBSTRING_INDEX(x,' ', 1),'-',-1) AS INTEGER)
    

    Wie Du Dir denken kannst, ist diese Sortierung alles andere als performant :-)

    Es besteht weiter eine strikte Abhängigkeit davon, dass Leerzeichen genau so vorhanden sind wie in Deinem Beispiel angegeben. Deine Einträge könnten beispielsweise so aussehen

    0 - 15 V

    und Du hast die Leerzeichen als unwichtig angesehen. In diesem Fall funktioniert die von mir angegebene Lösung natürlich nicht, Du müsstest sie entsprechend modifizieren.

    Grundsätzlich halte ich es nicht für eine gute Idee, Daten so wie von Dir beschrieben, zu speichern. Ganz gewiss nicht in Deinem Beispiel mit der Spalte x und der Obergrenze. Das könntest Du jetzt selbst einsehen.

    Freundliche Grüße

    Vinzenz