aufdemschlauchsteher: mysql query - order by Frage - und Logikproblem

Hallo,

ich habe da mal zwei Fragen:

  1. MySql Statement order by - kann man das mit mathematischen Funktionen versehen und wenn ja wie? Habe in meiner Tabelle eine Spalte mit Int Werten zwischen 1 und 12 und möchte danach sortieren allerdings nicht unbedingt ab der 1 sondern z.B. ab 8 also 8 9 10 11 12 1 2 3 4 5 6 7 Bisher habe ich das so gelöst, dass ich mir per SQL Statement das Array ausgeben lasse und dieses dann via PHP umsortiere - das sollte doch auch einfacher gehen, oder?

  2. Hier stehe ich mit der Abfrage-Logik ein bisschen auf dem Schlauch - vielleicht hat einer von euch ja eine gute Idee: De facto habe ich zwei Spalten mit den Int Werten 1 - 12 also eine "von" und eine "bis" Spalte. Wie sortiere ich diese sinnvoll ?

Wieder davon ausgehend, dass 8 als Grundlage der Sortierung genommen wird: zuerst schauen welche Einträge nur bis 8 gehen dann Einträge die nur von 8 bis 8 gehen dann Einträge die von kleiner 8 bis größer 8 gehen dann Einträge die ab 8 gehen, und dies dann für alle Nummern aufsteigend Konnte ich klar machen was ich meine?

  • Eintrag 1: von 8 bis 8
  • Eintrag2: von 5 bis 9
  • Eintrag3 von 4 bis 8
  • Eintrag4: von 12 bis 8
  • Eintrag5: von 12 bis 7
  • Eintrag6: von 8 bis 10
  • Eintrag7: von 9 bis 11
  • Eintrag8 von 9 bis 9
  • Eintrag9 von 9 bis 2
  • Ausgabe: Eintrag4, Eintrag3, Eintrag1, Eintrag 2, Eintrag6, Eintrag8, Eintrag7, Eintrag9, Eintrag5

Also quasi wird sortiert nach Bereich in dem die Nummer ist, Größe des Bereichs und Position in dem Bereich - wie kann man so was logisch formulieren? Habt ihr eine besser Sortierungsmethode?

Danke und frohe Weihnachten

  1. Tach!

    1. MySql Statement order by - kann man das mit mathematischen Funktionen versehen und wenn ja wie?

    Ja, nicht nur Spalten oder Aliasnamen, auch komplexe Ausdrücke kann man nehmen. Man schreibt da einfach die Formel hin, die einen sortierbaren Wert liefert. Du kannst alle Funktionen aus der Dokumentation verwenden. Braucht du dazu Logik, kannst du das zum Beispiel mit IF() machen.

    dedlfix.

    1. Tach!

      1. MySql Statement order by - kann man das mit mathematischen Funktionen versehen und wenn ja wie?

      Ja, nicht nur Spalten oder Aliasnamen, auch komplexe Ausdrücke kann man nehmen. Man schreibt da einfach die Formel hin, die einen sortierbaren Wert liefert. Du kannst alle Funktionen aus der Dokumentation verwenden. Braucht du dazu Logik, kannst du das zum Beispiel mit IF() machen.

      dedlfix.

      Hi Dedlfix, schon mal Danke für den Link und den Tipp - eine Frage: macht es dann mehr Sinn das im Select teil zu machen oder im order by Teil? Also:

      select spalte_von(FORMEL) as start from table order by start

      oder

      select spalte_von as start from table order by start(FORMEL)

      wie würde man die Formel richtig schreiben? start=(spalte_von -8) if (start<0) {start = start+12}

      1. Tach!

        macht es dann mehr Sinn das im Select teil zu machen oder im order by Teil?

        Bleibt sich vom Prinzip her gleich. Wenn du den Sortiertwert nicht benötigst, stell die Formel ins ORDER BY.

        wie würde man die Formel richtig schreiben?

        Also für den Teil eins, musst du dir eine Logik ausdenken, bei der 8 bis 12 kleiner werden als 1. Oder andersrum, dass 1 bis 7 größer werden als 12. Zum Beispiel so: wenn Wert kleiner als 8 ist, dann Wert plus 12, ansonsten einfach nur den Wert.

        Für Teil zwei hab ich keine Lösung, da verstehe ich grad nicht, was da genau wie aussehen soll. Wenn das Kriterium zweiteilig ist, also zum Beispiel der eine Teil immer vor dem ersten kommen soll, dann kannst du mit einem IF() 0 oder 1 zurückgeben und diese Formel als ersten Teil ins ORDER BY schreiben. Die Formel für das zweite Kriterium kommt dann nach einem Komma dahinter.

        dedlfix.

    2. @@dedlfix

      Man schreibt da einfach die Formel hin, die einen sortierbaren Wert liefert. Du kannst alle Funktionen aus der Dokumentation verwenden. Braucht du dazu Logik, kannst du das zum Beispiel mit IF() machen.

      Brauchst du hier aber nicht; das kannst du mit MOD machen.

      LLAP 🖖

      --
      „Wenn du eine weise Antwort verlangst, musst du vernünftig fragen.“ —Johann Wolfgang von Goethe
  2. @@aufdemschlauchsteher

    Habe in meiner Tabelle eine Spalte mit Int Werten zwischen 1 und 12 und möchte danach sortieren allerdings nicht unbedingt ab der 1 sondern z.B. ab 8 also 8 9 10 11 12 1 2 3 4 5 6 7

    Sollen das etwa Uhrzeiten sein? (Die im falschen Format vorliegen?)

    LLAP 🖖

    --
    „Wenn du eine weise Antwort verlangst, musst du vernünftig fragen.“ —Johann Wolfgang von Goethe
    1. @@aufdemschlauchsteher

      Sollen das etwa Uhrzeiten sein? (Die im falschen vormat vorliegen?)

      LLAP 🖖

      Nein, das sind im Prinzip Monatsangaben (die im falschen Format vorliegen ;-) ) habe das nicht als Monat deklariert, da ich im Prinzip nur den Int Wert benötige.

      Das mit dem Mod hatte ich auch schon überlegt aber wenn ich mod() richtig verstehe würde doch z.B. 4%8 - 4 zurückgeben und 12%8 ebenfalls - oder gibt es da eine andere Möglichkeit?

      Grüße

      1. @@aufdemschlauchsteher

        Sollen das etwa Uhrzeiten sein? (Die im falschen vormat vorliegen?) Nein, das sind im Prinzip Monatsangaben (die im falschen Format vorliegen ;-) )

        Huch, was hat denn die Spracheingabe da vormatiert?

        Das mit dem Mod hatte ich auch schon überlegt aber wenn ich mod() richtig verstehe würde doch z.B. 4%8 - 4 zurückgeben und 12%8 ebenfalls

        Ja, aber du willst nicht modulo 8 rechnen, sondern … – wieviel Monate gibt’s denn?

        LLAP 🖖

        --
        „Wenn du eine weise Antwort verlangst, musst du vernünftig fragen.“ —Johann Wolfgang von Goethe
        1. @@aufdemschlauchsteher

          Sollen das etwa Uhrzeiten sein? (Die im falschen vormat vorliegen?) Nein, das sind im Prinzip Monatsangaben (die im falschen Format vorliegen ;-) )

          Huch, was hat denn die Spracheingabe da vormatiert?

          oops, ist mir gar nicht aufgefallen - der Smiley hat sich darauf bezogen, dass die Daten zwar anders gemeint aber trotzdem im falschen Format vorliegen....

          Ja, aber du willst nicht modulo 8 rechnen, sondern … – wieviel Monate gibt’s denn?

          Ok, jetzt stehe ich auf zwei Schläuchen... modulo 12 bringt mir nichts (außer dass 12 an den Anfang sortiert wird) - wenn ich von der 8 aus sortieren will oder von der 6 wüßte ich gerade nicht wie ich über modulo dorthin kommen könnte...

          1. Tach!

            Ja, aber du willst nicht modulo 8 rechnen, sondern … – wieviel Monate gibt’s denn?

            Ok, jetzt stehe ich auf zwei Schläuchen... modulo 12 bringt mir nichts (außer dass 12 an den Anfang sortiert wird) - wenn ich von der 8 aus sortieren will oder von der 6 wüßte ich gerade nicht wie ich über modulo dorthin kommen könnte...

            Erstmal ein Offset addieren, so dass die 8 bei modulo auf 0 landet.

            Am Ende solltest du dir auch noch die Frage nach der Code-Lesbarkeit stellen. Man kann oftmals irgendeine clevere Lösung implementieren. Aber kann man später noch verstehen, was der Sinn war?

            dedlfix.

            1. Erstmal ein Offset addieren, so dass die 8 bei modulo auf 0 landet.

              Facepalm - habe doch gesagt ich stehe auf dem Schlauch... hätte ich auch selber drauf kommen können(müssen) - Danke!