sql >> Databasteknik >  >> RDS >> Mysql

Sortering/beställning i MySQL

Du kan dela upp dem i deras beståndsdelar som:

SELECT REPLACE(SUBSTRING(SUBSTRING_INDEX(prog_id, '.', 1),
       LENGTH(SUBSTRING_INDEX(prog_id, '.', 1 -1)) + 1),
       '.', '') AS id1,
       REPLACE(SUBSTRING(SUBSTRING_INDEX(prog_id, '.', 2),
       LENGTH(SUBSTRING_INDEX(prog_id, '.', 2 -1)) + 1),
       '.', '') AS id2,
       REPLACE(SUBSTRING(SUBSTRING_INDEX(prog_id, '.', 3),
       LENGTH(SUBSTRING_INDEX(prog_id, '.', 3 -1)) + 1),
       '.', '') AS id3
FROM programs
ORDER BY CAST(id1 AS INT(4)), CAST(id2 AS INT(4)), CAST(id3 AS INT(4))

Den bästa metoden skulle vara att skapa de extra fälten som yoda2k säger, men om du inte har den åtkomsten kan du använda ovanstående.

Du kan kapsla in det i en funktion som:

CREATE FUNCTION SPLIT_STR(
  x VARCHAR(255),
  delim VARCHAR(12),
  pos INT
)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos),
       LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1),
       delim, '');

Gör sedan:

SELECT SPLIT_STR(prog_id, '.', 1) AS id1,
   SPLIT_STR(prog_id, '.', 2) AS id2,
   SPLIT_STR(prog_id, '.', 3) AS id3,
FROM programs
ORDER BY CAST(id1 AS INT(4)), CAST(id2 AS INT(4)), CAST(id3 AS INT(4))


  1. MySQL kolumntyp TIMESTAMP inkluderar implicit INTE NULL DEFAULT CURRENT_TIMESTAMP ON UPPDATERING CURRENT_TIMESTAMP

  2. Hur lägger man till inledande noll till olika char-längder i mysql?

  3. MySQL- Wamp-servern fungerar inte efter win10-uppgradering

  4. Hur låses innodb-tabeller när ON INSERT-utlösaren bearbetas?