Lukas: mysql5: Sortierung will nicht, wie ich will

Hallo,

Was macht mysql, wenn

  
LEFT JOIN reihenfolge r ON r.ID = t.ID  
...  
order by r.eintrag,t.tid  

zu einem Eintrag der Tabelle mit dem Alias t keine Reihenfolge in der Tabelle "reihenfolge" eingetragen ist. (eintrag=int, tid=int)

Konkretes Beispiel:

Teile: (Alias t)     reihenfolge: (Alias r)
ID,tid               ID,eintrag
-------              -----------------------
1,5                  1,1
2,6                  2,4
3,7                  3,2
4,8                  4,3
5,9
6,10

Ziel wäre gewesen, daß die Reihenfolge der Query

1
3
4
2
5
6

wäre, aber es kommt etwas anderes heraus:

5
6
1
3
4
2

Kann ich die ORDER BY Klausel so formulieren, daß mein gewünschtes Ergebnis heraus kommt?

Lukas

  1. LEFT JOIN reihenfolge r ON r.ID = t.ID
    ...
    order by r.eintrag,t.tid

      
      
    
    > Kann ich die ORDER BY Klausel so formulieren, daß mein gewünschtes Ergebnis heraus kommt?  
      
    mysql sortiert NULL halt an den anfang, und dann erst wird nach t.tid sortiert. das ist schon richtig so. (wobei man natürlich darüber streiten kann, wo eine NULL in der sortierung hingehört)  
      
    versuch mal das hier:  
    ~~~sql
      
    order by IFNULL(r.eintrag,t.tid)  
    
    

    ausserdem habe ich noch folgenden trick gefunden:

      
    order by -r.eintrag DESC, t.tid  
    
    

    habs nicht ausprobiert.

    1. anmerkung: der zweite vorschlag sortiert einfach die NULLs nach hinten, was aber bei einem anderen daten als im beispel dann wieder falsch sein könnte. fand ich nur einen interessanten trick.

    2. Hallo tinita,

      mysql sortiert NULL halt an den anfang, und dann erst wird nach t.tid sortiert. das ist schon richtig so. (wobei man natürlich darüber streiten kann, wo eine NULL in der sortierung hingehört)

      versuch mal das hier:

      order by IFNULL(r.eintrag,t.tid)

        
      Das war mir neu, daß mysql das so sortiert. Die IFNULL-Weiche funktioniert einwandfrei, danke.  
        
      
      > ausserdem habe ich noch folgenden trick gefunden:  
      > ~~~sql
        
      
      > order by -r.eintrag DESC, t.tid  
      > 
      
      

      habs nicht ausprobiert.

      Mir gefällt die IFNULL-Weiche besser, die ist schöner lesbar, finde ich.

      Danke, Lukas

    3. Moin tinita,

      mysql sortiert NULL halt an den anfang, und dann erst wird nach t.tid sortiert. das ist schon richtig so. (wobei man natürlich darüber streiten kann, wo eine NULL in der sortierung hingehört)

      Die NULL-Behandlung in SQL ist allgemein eher unintuitiv. NULL = NULL ist z.B. auch NULL. Auch Typecasts auf NULL enden in NULL: SELECT NULL::boolean, NULL::text ergibt NULL, NULL.

      LG,
       CK