werbeklaus: Sortierung: Bei Besonderheit hervorholen

Hallo,
<http://forum.de.selfhtml.org/archiv/2006/1/t122041/@Im Archiv könnt ihr, falls es euch interessiert, die Vorgeschichte durchlesen>, dies ist aber nicht notwendig :-)

Ich möchte gerne in einer MySQL-Tabelle die Einträge nach id sortieren. Solls ja geben.
Manche Einträge haben nun einen "Partner":

ID | Partner
1  | 0
2  | 0
3  | 3
4  | 0
5  | 5
6  | 0
....

Nun soll jedoch, in diesem Beispiel nach ID sortiert werden, falls ein Eintrag jedoch einen Partner hat, dieser vorgezogen werden.

Kann mir jemand bei dem Sortierungsbefehl behilflich sein?

Danke,
werbeklaus

  1. Hi,

    Nun soll jedoch, in diesem Beispiel nach ID sortiert werden, falls ein Eintrag jedoch einen Partner hat, dieser vorgezogen werden.

    laut Deiner Auflistung haben alle Einträge einen Partner, die meisten davon den selben,

    Kann mir jemand bei dem Sortierungsbefehl behilflich sein?

    so dass mir Dein Problem nicht ersichtlich ist.

    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. Hallo,

      laut Deiner Auflistung haben alle Einträge einen Partner, die meisten davon den selben,

      0 steht für "keinen" :-)

      jetzt ersichtlich?

      werbeklaus

      1. Hi,

        laut Deiner Auflistung haben alle Einträge einen Partner, die meisten davon den selben,
        0 steht für "keinen" :-)

        nein, 0 steht für 0. Für "keinen" steht NULL.

        jetzt ersichtlich?

        Für mich und eine Datenbank nicht. Dein DB-Layout - genauer gesagt eine Entscheidung bezüglich der Inhalte - ist fehlerhaft.

        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. Hallo,

          Für mich und eine Datenbank nicht. Dein DB-Layout - genauer gesagt eine Entscheidung bezüglich der Inhalte - ist fehlerhaft.

          Okay, du meinst ich sollte 0 gänzlich durch NULL ersetzen. Dann werd ich das machen :-)
          Und wie sortiere ich es richtig?

          werbeklaus

          1. Hi,

            Und wie sortiere ich es richtig?

            primäre Sortierung nach "wenn NULL dann 0, sonst 1" absteigend, sekundäre Sortierung nach ID. Und jetzt darfst Du die Doku konsultieren ;-)

            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. Hallo,

              primäre Sortierung nach "wenn NULL dann 0, sonst 1" absteigend, sekundäre Sortierung nach ID.

              Das dürfte machbar sein. Nur ich denke nicht, dass mich das zu meinem Ziel führt, da dann ja zwingend zuerst alle MIT Partner kommen, was ja (falls id 1 zB keinen hat) nicht sein soll!

              Und jetzt darfst Du die Doku konsultieren ;-)

              Wenn du damit die MySQL-Doku meinst, muss ich sagen, dass ich mit der bis jetzt noch keine guten Erfahrungen gemacht habe: Sowie "Order" noch "If" finde ich dort erklärt!

              werbeklaus

  2. Hallo,

    Kann mir jemand bei dem Sortierungsbefehl behilflich sein?

    Wie wärs damit?

    SELECT * FROM tabelle ORDER BY Partner DESC, id;

    Das setzt Dir alle Einträge mit Partner an den Anfang und sortiert danach nach der id.

    Alternative wär noch evtl. GROUP BY aber dafür ist mein SQL zu eingerostet :)

    1. Hallo,

      Das setzt Dir alle Einträge mit Partner an den Anfang und sortiert danach nach der id.

      Darum gehts ja nicht!
      Wenn die 1 keinen Partner hat, soll ja trotzdem als erstes kommen!
      Nur wenn beim "durchgehen" der ID ein Partner auftaucht, soll dieser sofort drankommen.

      Anders ausgedrückt:
      Partner sollen zwingend nacheinander drankommen, und zwar an der Stelle dessen, der die zuerst kommen würde :-)

      werbeklaus

  3. yo,

    Nun soll jedoch, in diesem Beispiel nach ID sortiert werden, falls ein Eintrag jedoch einen Partner hat, dieser vorgezogen werden.

    SELECT id, partner, IF(partner = 0, id, partner) AS check
    FROM tabelle
    ORDER BY 3

    Ilja

    1. Hallo

      You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'check  FROM persons  ORDER BY 3  LIMIT 0, 30' at line 1

      Mehr viel ihm nicht dazu ein.
      Da ich die Abfrage selbst nicht zu 100% verstehe, kann ich leider auch nicht beurteilen, wo da der Fehler ist....

      werbeklaus

      1. hi,

        You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'check  FROM persons  ORDER BY 3  LIMIT 0, 30' at line 1

        Mehr viel ihm nicht dazu ein.
        Da ich die Abfrage selbst nicht zu 100% verstehe, kann ich leider auch nicht beurteilen, wo da der Fehler ist....

        CHECK ist ein reserviertes Wort in MySQL.

        (Aber warum Ilja nach 3 sortieren lassen will, verstehe ich gerade auch noch nicht. Ist das eine mir unbekannte Syntax für "sortiere nach dem dritten selektieren Spaltenwert ...?)

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. Hallo,

          CHECK ist ein reserviertes Wort in MySQL.

          Stimmt, ersetze ich dies, kommt wenigstens ein Ergebnis!

          (Aber warum Ilja nach 3 sortieren lassen will, verstehe ich gerade auch noch nicht. Ist das eine mir unbekannte Syntax für "sortiere nach dem dritten selektieren Spaltenwert ...?)

          Anscheinend. Auf jeden Fall kommt dabei das gleiche Ergebnis....

          Funktionieren tut es jedoch noch nicht komplett:

          id  partner test
          2 1  1
          1 2  2
          8 3  3
          9 4  4
          10 5  5
          6 0  6
          7 0  7
          3 8  8
          4 9  9
          5 10  10

          Exakt stimmen tut das ja nicht, id 1 sollt vor 2 kommen, dann erst 3 und 8.
          Noch weiter Ideen ? *bittendguck*

          werbeklaus

    2. hallo,

      SELECT id, partner, IF(partner = 0, id, partner) AS check

      Ich denke, dass beste wäre, wenn mir jemand mal kurz und knapp die Funktion dieses "if"s erklären, oder noch besser, mir eine Erklärung dazu im im Internet zeigen könnte.

      Falls partner = 0, soweit komme ich, nur was mögen mir die kommagetrennten 'id' und 'partner' danach sagen ?

      Danke,
      werbeklaus

      1. SELECT id, partner, IF(partner = 0, id, partner) AS check

        Falls partner = 0, soweit komme ich, nur was mögen mir die kommagetrennten 'id' und 'partner' danach sagen ?

        WENN partner = 0
        DANN ist check = id
        SONST ist check = partner

        In einer Programmiersprache könntest Du das so schreiben:

        check = (partner == 0) ? id : partner;

        oder ausführlicher:

        if (partner == 0) {check = id;}
        else [check = partner;}

      2. Hallo,

        Falls partner = 0, soweit komme ich, nur was mögen mir die kommagetrennten 'id' und 'partner' danach sagen ?

        Hm, vermutlich wie in Excel und Co, denk ich mir grad:

        IF (Bedingung, Dann, Sonst)

        Tschuldigung für das übereilige Fragen :-)

        werbeklaus

  4. Hallo allerseits!
    Habe durch einiges rumprobieren nun eine funktionierende Lösung:

    SELECT
      id,
      IF (IF (partner < id, partner, id) = 0, 99999, IF (partner < id, partner, id)) as sortby
    from
    persons
    ORDER BY sortby ASC, id ASC

    Falls id oder Partner gleich 0, dann eine hohe zahl (das simple 99999 gefällt mir nicht, was besseres fällt mir aber nicht ein), ansonsten das kleinere von partner oder id.
    Bei gleichheit (also den beiden Partnern) dann die kleinere ID zuerst.
    So klappt es nun!
    Danke fürs mitdenken!

    werbeklaus