Der Manuel: 2 Felder gleichwertig sortieren

Hallo,

ich habe folgendes Problem und versuche nun das Problem seit einigen
Stunden zu lösen.

Und zwar folgendes.
Ich habe eine Tabelle, die einige Daten beinhaltet und dann noch 2
Felder für ein Ranking.

rank_1 | rank_2
10         8
9          5
5          8
7          6
2          6

Angenommen, das obere Beispiel ist bereits die sortierte Lieste, so wie
ich sie gerne haben möchte. Wie kann ich das gewünschte Ergebnis
erhalten?
Ist dies überhautp möglich ?

Mit ORDER BY wird ja leider nur spaltenweise ausgewertet.
Da bekomme ich dann lediglich zuerst die Spalte rank_1 sortiert und dann rank_2.

Weiss jemand Rat ?

Vielen Dank im voraus.

Gruß, Manuel

  1. Hi,

    Angenommen, das obere Beispiel ist bereits die sortierte Lieste, so wie
    ich sie gerne haben möchte.

    gut, angenommen das wäre sie. Dann lautet die Angabe: "ORDER BY RANDOM", denn ich kann keinerlei Logik erkennen. Falls Du eine solche siehst, solltest Du sie erklären.

    Mit ORDER BY wird ja leider nur spaltenweise ausgewertet.

    Nein, wertweise. Ob die Werte sich aus einer Spalte ergeben, aus mehreren oder aus gar keinen, ist der ORDER BY Klausel herzlich wurscht.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      gut, angenommen das wäre sie. Dann lautet die Angabe: "ORDER BY RANDOM", denn ich kann keinerlei Logik erkennen. Falls Du eine solche siehst, solltest Du sie erklären.

      Hi,
      klar, mein Fehler.

      Mit ORDER BY wird ja leider nur spaltenweise ausgewertet.

      Nein, wertweise. Ob die Werte sich aus einer Spalte ergeben, aus mehreren oder aus gar keinen, ist der ORDER BY Klausel herzlich wurscht.

      Hmm, aber wenn ich die Abfrage mache, dann wird nunmal zuerst die Spalte
      rank_1 und danach die Spalte rank_2 ausgewertet. Sprich, es wird
      nicht geschaut, ob der Wert von rank_2 größer ist als der Wert von
      rank_1 und dann wird der Wert von rank_2 genommen.

      Cheatah

      Zur Erklärung der Logik:

      Wenn ich nun einen rank_1 mit 0 hab und einen rank_2 mit 0, dann
      ist dieser natürlich in der Summe nur 10.
      Dementsprechend würde dieser in der oben angegebenen Tabelle an vorletzter Stelle stehen.
      Eigentlich sollte er dann schauen. Wenn rank_1 grösser rank_2, dann nimm rank_1 und umgekehrt.
      quasi:
      if (rank_1 >= rank_2) then rank_1
      else rank_2

      Leider hab ich gar keinen Plan wie ich das in MySQL umsetzen kann.

      Gruß, Manuel

      1. Hallo,

        Zur Erklärung der Logik:

        Wenn ich nun einen rank_1 mit 0 hab und einen rank_2 mit 0, dann
        ist dieser natürlich in der Summe nur 10.

        Ah, ja, 0 + 0 = 10, das ist logisch ;-)

        Eigentlich sollte er dann schauen. Wenn rank_1 grösser rank_2, dann nimm rank_1 und umgekehrt.
        quasi:
        if (rank_1 >= rank_2) then rank_1
        else rank_2

        Leider hab ich gar keinen Plan wie ich das in MySQL umsetzen kann.

        Eventuell genau so?

        viele Grüße

        Axel

        1. Eventuell genau so?

          viele Grüße

          Axel

          Hallo,

          perfekt, genau so. Hab ich wohl stets übersehen oO

          Mit folgender Syntax komme ich zu meinem Ziel:

          SELECT *
          FROM table
          WHERE ranking_enableb=1
          ORDER BY
          CASE 1
          WHEN rank_1 >= rank_2
          THEN rank\_1
          WHEN rank_2 > rank_1
          THEN rank\_2
          END DESC;

          vielen, vielen Dank nochmal für die schnellen Antworten und die Hilfe !!

          Wünsche noch eine schöne Woche.

          Gruß, Manuel

          1. Hallo,

            Eventuell genau so?

            perfekt, genau so. Hab ich wohl stets übersehen oO

            Mit folgender Syntax komme ich zu meinem Ziel:

            SELECT *
            FROM table
            WHERE ranking_enableb=1
            ORDER BY
            CASE 1
            WHEN rank_1 >= rank_2
            THEN rank\_1
            WHEN rank_2 > rank_1
            THEN rank\_2
            END DESC;

            Eigentlich hatte ich auf das IF-Statement verlinkt. Im anderen Thread-Zweig (hatte ich nicht gelesen) wurde das auch schon mal getan.

            ...
            ORDER BY
            (IF(rank_1 >= rank_2, rank_1, rank_2)
            DESC;

            viele Grüße

            Axel

            1. Eigentlich hatte ich auf das IF-Statement verlinkt. Im anderen Thread-Zweig (hatte ich nicht gelesen) wurde das auch schon mal getan.

              ...
              ORDER BY
              (IF(rank_1 >= rank_2, rank_1, rank_2)
              DESC;

              viele Grüße

              Axel

              Aber CASE funktioniert genauso.
              Oder gibt es dort Performanceunterschiede ?

              1. Hi,

                (IF(rank_1 >= rank_2, rank_1, rank_2)
                Aber CASE funktioniert genauso.
                Oder gibt es dort Performanceunterschiede ?

                Ich schätze, das von steckl erwähnte GREATEST dürfte effizienter als Dein CASE sein.

                cu,
                Andreas

                --
                Warum nennt sich Andreas hier MudGuard?
                O o ostern ...
                Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  2. Hallo,

    rank_1 | rank_2 | rank
    10         8       18
    9          5       14
    5          8       13
    7          6       13
    2          6        8

    Du legst eine dritte Spalte an in der du die Summe der beiden anderen Spalten speicherst. Dann wendest du ORDER BY auf die dritte Spalte an.

    Gruss,
    OhneName

    1. Hi,

      rank_1 | rank_2 | rank
      10         8       18
      9          5       14
      5          8       13
      7          6       13
      2          6        8

      Du legst eine dritte Spalte an in der du die Summe der beiden anderen Spalten speicherst. Dann wendest du ORDER BY auf die dritte Spalte an.

      Das ist überflüssig und außerdem äußerst unsauber.
      Dadurch hättest du Redundanzen in der Datenbank, was dem Prinzip der Normalisierung wiederspricht.

      Es geht auch ohne zusätzliche Spalte. In mySql siehts dann beispielsweise so aus:
      SELECT rank1,rank2, rank1+rank2 AS summe FROM tabelle ORDER BY summe desc;

      mfG,
      steckl

      1. Hi,

        rank_1 | rank_2 | rank
        10         8       18
        9          5       14
        5          8       13
        7          6       13
        2          6        8

        Hallo,

        vielen Dank erstmal für die prompte Hilfe :)

        Der Lösungsvorschlag ist gar nicht mal so schlecht, hab ich gar nicht
        dran gedacht.
        Leider sehe ich dann folgendes Problem:

        Wenn ich nun einen rank_1 mit 0 hab und einen rank_2 mit 0, dann
        ist dieser natürlich in der Summe nur 10.
        Dementsprechend würde dieser in der oben angegebenen Tabelle an vorletzter Stelle stehen.
        Eigentlich sollte er dann schauen. Wenn rank_1 grösser rank_2, dann nimm rank_1 und umgekehrt.
        quasi:
        if (rank_1 >= rank_2) then rank_1
        else rank_2

        Leider hab ich gar keinen Plan wie ich das in MySQL umsetzen kann.

        Falls es gar net geht, dann muss ich wohl die Tabelle ein wenig
        abändern, was jetzt ein wenig umständlich ist (da komplexer...).

        Aber nochmals vielen, vielen Dank.

        Gruß, Manuel

        1. Hi,

          Wenn ich nun einen rank_1 mit 0 hab und einen rank_2 mit 0, dann
          ist dieser natürlich in der Summe nur 10.

          0 + 0 = 10?
          Seltsame Definition von Summe ...

          Eigentlich sollte er dann schauen. Wenn rank_1 grösser rank_2, dann nimm rank_1 und umgekehrt.
          quasi:
          if (rank_1 >= rank_2) then rank_1
          else rank_2

          Willst Du nach dem Maximum der beiden Spalten sortieren?

          Wenn nein: sag doch endlich, wonach Du sortieren willst.

          cu,
          Andreas

          --
          Warum nennt sich Andreas hier MudGuard?
          O o ostern ...
          Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
          1. Hi,

            Wenn ich nun einen rank_1 mit 0 hab und einen rank_2 mit 0, dann
            ist dieser natürlich in der Summe nur 10.

            0 + 0 = 10?
            Seltsame Definition von Summe ...

            Eigentlich sollte er dann schauen. Wenn rank_1 grösser rank_2, dann nimm rank_1 und umgekehrt.
            quasi:
            if (rank_1 >= rank_2) then rank_1
            else rank_2

            Willst Du nach dem Maximum der beiden Spalten sortieren?

            Wenn nein: sag doch endlich, wonach Du sortieren willst.

            cu,
            Andreas

            Öhm, stimmt, da ist die 1 irgendwo verloren gegangen.
            Natürlich meinte ich 10 + 0.

            Es soll nach dem größeren Wert in einer Zeile sortiert werden.
            Wenn ich also zeilenweise durchgehe wie im Beispiel, dann soll nach dem größeren Wert sortiert werden und dann halt noch wie bei ORDER BY die
            Spalten.

            nicht sortierte Tabelle...
            || rank_1 || rank_2 ||

            ||  5     ||   3    ||
            ||  7     ||   0    ||
            ||  8     ||  10    ||
            || 10     ||   8    ||
            ||  2     ||   3    ||
            ||  0     ||   9    ||

            Ergebnisliste:

            || rank_1 || rank_2 ||

            || 10     ||   8    ||
            ||  8     ||  10    ||
            ||  0     ||   9    ||
            ||  7     ||   0    ||
            ||  5     ||   3    ||
            ||  2     ||   3    ||

            Ich hoffe mal, dass es hiermit klarer wird, was ich als Ergebnis
            möchte. rank_1 wird bevorzugt, wenn der Wert zweier oder mehrerer
            Felder gleich ist (siehe 1. und 2. Zeile der Ergebnisliste).

            Gruß, Manuel

        2. Hi,

          Wenn ich nun einen rank_1 mit 0 hab und einen rank_2 mit 0, dann
          ist dieser natürlich in der Summe nur 10.

          0 + 0 ist natürlich nicht 10. Da hast du dich wohl vertippt?

          Eigentlich sollte er dann schauen. Wenn rank_1 grösser rank_2, dann nimm rank_1 und umgekehrt.
          quasi:
          if (rank_1 >= rank_2) then rank_1
          else rank_2

          Leider hab ich gar keinen Plan wie ich das in MySQL umsetzen kann.

          In mySql gibt es auch IF-Abfragen.
          Aber es gibt auch die Funktion GREATEST, die dir beispielsweise den größten Wert aus beliebigen Spalten liefert. Damit ist es noch einfacher.

          mfG,
          steckl