Franzi: SQL Order by

Hallo,

Es geht um den SQL-Befehl ORDER BY.

Ich möchte meine Daten ordnen, allerdings nicth einfach auf- oder absteigend, sondern nach folgender Ordnung (alles Inhalte der Spalte "Stimme"):

Sopran
Alt 1
Alt 2
Tenor
Bass

Wie ihr seht, handelt es sich um eine Chorbesetzung, die Mitglieder gehören den genannten Stimmen an.
Das dies weder ASC noch DESC ist, würde ich gerne wissen, wie das zu realisieren wäre.
Danke für die Hilfe!

  1. Hallo,

    Es geht um den SQL-Befehl ORDER BY.

    Ich möchte meine Daten ordnen, allerdings nicth einfach auf- oder absteigend, sondern nach folgender Ordnung (alles Inhalte der Spalte "Stimme"):

    Sopran
    Alt 1
    Alt 2
    Tenor
    Bass

    Wie ihr seht, handelt es sich um eine Chorbesetzung, die Mitglieder gehören den genannten Stimmen an.
    Das dies weder ASC noch DESC ist, würde ich gerne wissen, wie das zu realisieren wäre.

    Mir wäre nichts bekannt, das wäre auch keine Sortierung sondern fast willkür.
    Meines erachtens gibt es 2 Möglichkeiten:

    1. (naja Hacklösung ) Sofern die Inhalte der Stimme bekannt/beschränkte Werte sind würde ich das mir megerer Selects mittels UNION machen.

    2. (bessere Lösung) Du normalisierts die db und gibst jedem Stimmentyp eine Nummer bzw Ordnungszahl und sortierts nach dieser.

    lg

  2. Das dies weder ASC noch DESC ist, würde ich gerne wissen, wie das zu realisieren wäre.
    Danke für die Hilfe!

    Mit normalisierten Daten ;-)

    Tabelle Stimme:

    ID: 1 Stimme: Alt
    ID: 2 Stimme: ...

    Grüße

  3. Du könntest die Stimmen in einer zweiten Tabelle halten, in der dann steht
    Sortierzahl | Stimme

    1 | Sopran
    2 | Alt 1
    3 | Alt 2

    Die joinst du zu deiner Tabelle dazu, mit der Stimme als Schlüssel und bei der Ausgabe sortierst du nach der Sortierzahl.

  4. Hi!

    Ich möchte meine Daten ordnen, allerdings nicth einfach auf- oder absteigend, sondern nach folgender Ordnung (alles Inhalte der Spalte "Stimme"):

    Definiere für jeden der Werte einen sortierbaren Wert. Frag mit dem CASE-WHEN-Konstrukt oder geschachtelter IF()-Funktionen (Falls dein DBMS die kennt), welcher Wert vorliegt und gib den entsprechenden Sortierwert zurück.

    Dabei entsteht ein recht aufwendiges Statement. Alternativ wäre es möglich, die Stimmen nicht als Klartext in der Mitgliedertabelle zu speichern sondern eine eigene Tabelle dafür anzulegen. Diese bekommt die Spalten: ID, Name, Sortierwert. In der Tabelle mit den Mitgliedern gibt es dann für die Stimme nur einen Verweis auf deren ID. Mittels eines JOINS kannst du die Stimmentabelle an die Mitgliedertabelle anknüpfen und den eigentlichen Stimmennamen und dessen Sortierwert nach Belieben verwenden.

    Lo!

    1. Hi!

      Ich möchte meine Daten ordnen, allerdings nicth einfach auf- oder absteigend, sondern nach folgender Ordnung (alles Inhalte der Spalte "Stimme"):

      Definiere für jeden der Werte einen sortierbaren Wert. Frag mit dem CASE-WHEN-Konstrukt oder geschachtelter IF()-Funktionen (Falls dein DBMS die kennt), welcher Wert vorliegt und gib den entsprechenden Sortierwert zurück.

      Kranke Idee aber irgendwie garnicht so blöd ;). Auf das wäre ich jetzt auch nicht gekommen ;) Funktioniert dann so

      SELECT *,
      IF(room.name = 'Sopran',1,
      IF(room.name = 'Alt 1',2,
              IF(room.name = 'Alt 2',3,
              IF(room.name = 'Tenor',4,
      IF(room.name = 'Bass',5,0)
      )))) AS order_id
      FROM 'TABELLE'
      ORDER BY order_id
      lg

      PS::(Mir ist heute Langweilig)

      1. SELECT *,
        IF(room.name = 'Sopran',1,
        IF(room.name = 'Alt 1',2,
                IF(room.name = 'Alt 2',3,
                IF(room.name = 'Tenor',4,
        IF(room.name = 'Bass',5,0)
        )))) AS order_id
        FROM 'TABELLE'
        ORDER BY order_id
        lg

        PS::(Mir ist heute Langweilig)

        Natürlich statt 'room.name' => "stimmen" Feld nehmen. Vergessen zu ändern ;)

        lg

        1. Danke für die Hilfe!!

          SELECT *,
          IF(room.name = 'Sopran',1,
          IF(room.name = 'Alt 1',2,
                  IF(room.name = 'Alt 2',3,
                  IF(room.name = 'Tenor',4,
          IF(room.name = 'Bass',5,0)
          )))) AS order_id
          FROM 'TABELLE'
          ORDER BY order_id
          lg

          PS::(Mir ist heute Langweilig)

          Natürlich statt 'room.name' => "stimmen" Feld nehmen. Vergessen zu ändern ;)

          lg

    2. Hi,

      Definiere für jeden der Werte einen sortierbaren Wert. Frag mit dem CASE-WHEN-Konstrukt oder geschachtelter IF()-Funktionen (Falls dein DBMS die kennt), welcher Wert vorliegt und gib den entsprechenden Sortierwert zurück.

      Wenn MySQL gemeint sein sollte - da kann man FIND_IN_SET() ganz praktisch für sowas benutzen.

      MfG ChrisB

      --
      “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]