Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Dezimal sortieren in PHP oder MySQL

Das ist hässlich, aber es wird funktionieren:

ORDER
   BY SUBSTRING_INDEX(CONCAT( col ,'.'),'.',1) + 0
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',2),'.',-1) + 0
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',3),'.',-1) + 0
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',4),'.',-1) + 0
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',5),'.',-1) + 0
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',6),'.',-1) + 0
    , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',7),'.',-1) + 0

Um diese Ausdrücke zu testen, können Sie sie in einem SELECT verwenden und überprüfen, ob sie die richtigen Komponenten extrahieren und richtig angeordnet sind:

SELECT col
     , SUBSTRING_INDEX(CONCAT( col ,'.'),'.',1) + 0 AS p1
     , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',2),'.',-1) + 0 AS p2
     , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',3),'.',-1) + 0 AS p3
     , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',4),'.',-1) + 0 AS p4
     , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',5),'.',-1) + 0 AS p5
     , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',6),'.',-1) + 0 AS p6
     , SUBSTRING_INDEX(SUBSTRING_INDEX(CONCAT( col ,'.'),'.',7),'.',-1) + 0 AS p7
  FROM mytable 
 ORDER BY 2,3,4,5,6,7,8

Anstatt zu erklären, wie das funktioniert, werde ich nur auf die wichtigen „Tricks“ eingehen

  • fügen Sie ein nachgestelltes "." am Ende der Spalte, das brauchst du, damit du nicht mehrfach auf die letzte Position zurückkommst,

  • Verwenden Sie SUBSTRING_INDEX, um den Teil bis zum n-ten '.'

    abzurufen
  • Verwenden Sie SUBSTRING_INDEX, um den abschließenden Teil davon abzurufen (rückwärts gelesen, bis zum führenden Punkt

  • Null hinzufügen, um den String in einen numerischen Wert umzuwandeln