sql >> Databasteknik >  >> RDS >> Mysql

Sortera decimal i PHP eller MySQL

Det här är fult, men det kommer att fungera:

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

För att testa dessa uttryck kan du använda dem i en SELECT och verifiera att de extraherar rätt komponenter och att de är korrekt ordnade:

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

Istället för att förklara hur det här fungerar, ska jag bara göra de viktiga "tricken"

  • lägg till en efterföljande "." i slutet av kolumnen behöver du det så att du inte får tillbaka den senaste positionen flera gånger,

  • använd SUBSTRING_INDEX för att hämta del upp till n:te '.'

  • använd SUBSTRING_INDEX för att hämta den avslutande delen av det (läser baklänges, till den inledande punkten

  • lägg till noll för att konvertera strängen till ett numeriskt värde



  1. Skillnaden mellan sql-satser och klausul

  2. Stora .PDF-filer laddas inte upp till MySQL-databasen som medium BLOB via PHP, filer under 2 MB fungerar bra

  3. Hämta/lagra alla relaterade skådespelare i Freebase

  4. Varför skulle Oracle.ManagedDataAccess inte fungera när Oracle.DataAccess gör det?