sql >> Database >  >> RDS >> Mysql

Sorteerkolom met getallen in SQL?

Uitgaan van de aanname het is altijd WORD_space_NUMBER dit zou moeten werken:

SELECT   *
FROM     table
ORDER BY CAST(SUBSTRING(column,LOCATE(' ',column)+1) AS SIGNED)

Gebruik POSITIE om de ruimte te vinden, SUBSTRING om het nummer erachter te pakken, en CAST om het een vergelijkbare waarde te maken.

Als er een ander patroon in de kolom is, laat het me weten en ik zal proberen een betere oplossing te bedenken.

BEWERKEN Bewezen te werken:

mysql> INSERT INTO t (st) VALUES ('a 1'),('a 12'),('a 6'),('a 11');
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM t ORDER BY st;
+----+------+
| id | st   |
+----+------+
|  1 | a 1  |
|  4 | a 11 |
|  2 | a 12 |
|  3 | a 6  |
+----+------+
4 rows in set (0.00 sec)

mysql> SELECT * FROM t ORDER BY CAST(SUBSTRING(st,LOCATE(' ',st)+1) AS SIGNED);
+----+------+
| id | st   |
+----+------+
|  1 | a 1  |
|  3 | a 6  |
|  4 | a 11 |
|  2 | a 12 |
+----+------+

mysql> INSERT INTO t (st) VALUES ('b 1'),('b 12'),('b 6'),('b 11');
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM t ORDER BY CAST(SUBSTRING(st,LOCATE(' ',st)+1) AS SIGNED);
+----+------+
| id | st   |
+----+------+
|  1 | a 1  |
|  5 | b 1  |
|  3 | a 6  |
|  7 | b 6  |
|  4 | a 11 |
|  8 | b 11 |
|  2 | a 12 |
|  6 | b 12 |
+----+------+
8 rows in set (0.00 sec)

mysql> SELECT * FROM t ORDER BY LEFT(st,LOCATE(' ',st)), CAST(SUBSTRING(st,LOCATE(' ',st)+1) AS SIGNED);
+----+------+
| id | st   |
+----+------+
|  1 | a 1  |
|  3 | a 6  |
|  4 | a 11 |
|  2 | a 12 |
|  5 | b 1  |
|  7 | b 6  |
|  8 | b 11 |
|  6 | b 12 |
+----+------+
8 rows in set (0.00 sec)

negeer mijn lame tabel / kolomnamen, maar geeft me het juiste resultaat. Ging ook een beetje verder en voegde dubbele sortering toe om het voorvoegsel van letters te verbreken met numeriek.

Bewerken SUBSTRING_INDEX zal het iets leesbaarder maken.

ORDER BY SUBSTRING_INDEX(st, " ", 1) ASC, CAST(SUBSTRING_INDEX(st, " ", -1) AS SIGNED)


  1. Hoe te kiezen uit twee tabellen in MySQL, zelfs als niet alle rijen in de ene tabel correspondenten hebben in de andere?

  2. onjuist doden van mysqld - start nu niet

  3. SQL DROP-index, DROP-tabel en DROP-databaseverklaringen uitgelegd met voorbeelden

  4. Twee query's mysql in één object json