Stefan Kleeschulte: [MySQL] Nach zwei Attributen sortieren...

Hi zusammen!

Ich kenne mich zwar ein ganz bisschen mit MySQL aus, und was ich nicht weiß, kann ich normalerweise nachschlagen, aber dieses Problem bekomme ich nicht in den Griff:

Ich habe eine Tabelle, in der es unteranderem eine Spalte "sysname" (VARCHAR) und eine Spalte "name" gibt. "sysname"-Werte können auch NULL sein. Nun möchte ich gerne zunächst alle Zeilen, bei denen "sysname" ungleich NULL ist alphabetisch sortiert nach "name", und dann alle Zeilen, bei dennen "sysname" gleich NULL ist alphabetisch sortiert nach "name" ausgeben.

Beispiel:
sysname1  Andreas
sysname3  Martin
sysname2  Ralf
NULL      Christina
NULL      Benedikt
NULL      Simone

Kann mir jemand sagen, wie ich das mit einiger einzigen Abfrage bewältige?

Grüße,
Stefan

  1. Hallo,

    Ich gehe mal davon aus, dass Du die Abfrage mit PHP machst. Ich stelle mir vor, es waere einfacher, 'sysname' und 'name' komplett abzufragen und nach 'name' zu sortieren. Im PHP-Script kannst Du dann sagen 'wenn sysname NULL ist gehoerst du zu diser Gruppe, sonst zu jener'.
    Im Ergebnis waere die Sortiereung so wie Du sie Dir vorstellst.

    Dieter

  2. Hallo,

    Ich habe eine Tabelle, in der es unteranderem eine Spalte "sysname" (VARCHAR) und eine Spalte "name" gibt. "sysname"-Werte können auch NULL sein. Nun möchte ich gerne zunächst alle Zeilen, bei denen "sysname" ungleich NULL ist alphabetisch sortiert nach "name", und dann alle Zeilen, bei dennen "sysname" gleich NULL ist alphabetisch sortiert nach "name" ausgeben.

    Beispiel:
    sysname1  Andreas
    sysname3  Martin
    sysname2  Ralf
    NULL      Christina
    NULL      Benedikt
    NULL      Simone

    Kann mir jemand sagen, wie ich das mit einiger einzigen Abfrage bewältige?

    Die Abfrage müsste in je einer zusätzlichen Spalte einmal die Namen ohne sysname und zum Anderen die Namen mit sysname separieren. Sortiert wird dann nach Name_ohne_sysname, Name_mit_sysname. Da die NULL-Werte der Namen_ohne_sysname nach oben sortiert werden, und hier (gleiche Werte NULL) die Sortierung nach Name_mit_sysname greift, sollte die gewünschte Reihenfolge entstehen.

    SELECT sysname, name, IF([sysname] IS NULL,[name],NULL) AS nosn, IF([sysname] IS NOT NULL,[name],NULL) AS nmsn
    FROM TabelleN
    ORDER BY IF([sysname] IS NULL,[name],NULL), IF([sysname] IS NOT NULL,[name],NULL);

    viele Grüße

    Axel

    1. Hi Axel!

      Die Abfrage müsste in je einer zusätzlichen Spalte einmal die Namen ohne sysname und zum Anderen die Namen mit sysname separieren. Sortiert wird dann nach Name_ohne_sysname, Name_mit_sysname. Da die NULL-Werte der Namen_ohne_sysname nach oben sortiert werden, und hier (gleiche Werte NULL) die Sortierung nach Name_mit_sysname greift, sollte die gewünschte Reihenfolge entstehen.

      SELECT sysname, name, IF([sysname] IS NULL,[name],NULL) AS nosn, IF([sysname] IS NOT NULL,[name],NULL) AS nmsn
      FROM TabelleN
      ORDER BY IF([sysname] IS NULL,[name],NULL), IF([sysname] IS NOT NULL,[name],NULL);

      Erstmal danke für deine Mühe, dass das so kompliziert ist, habe ich nicht gedacht.

      MySQL meldet allerdings:

      You have an error in your SQL syntax near '[sysname] IS NULL,[name],NULL) AS nosn, IF([sysname] IS NOT NULL,[name],NULL) AS' at line 1

      Den Tabellennamen habe ich angepasst. Hast du noch eine Idee? Wenn nich, is auch nicht schlimm...

      Grüße,
      Stefan

      1. Hi Stefan,

        Erstmal danke für deine Mühe, dass das so kompliziert ist, habe ich nicht gedacht.

        Du brauchst eine 3GL-Funktionalität in einer 4GL - das ist nun mal nicht der Zweck der Sache. (Ich würde Dein Problem mit zwei Queries lösen wollen.)

        Hast du noch eine Idee? Wenn nich, is auch nicht schlimm...

        Statt der verwendung des "if" könntest Du versuchen, in einer dritten Spalte über eine concat-artige Konstruktion einen gemeinsamen Sortier-Schlüssel zu bauen und nach diesem dann zu sortieren.
        Dies setzt allerdings ggf. Kenntnisse über die möglichen Inhalt von "sysname" voraus ...

        Viele Grüße
              Michael

        --
        T'Pol: I apologize if I acted inappropriately.
        V'Lar: Not at all. In fact, your bluntness made me reconsider some of my positions. Much as it has now.