Hier ist eine kleine Probe Nutzungs SUBSTRING_INDEX und virtuelle Spalte
Beispiel: Show sortiert Reihen von einem kleinen Tisch
MariaDB [yourschema]> SELECT * FROM l ORDER BY substring_index(LEVEL,' ',-1)+0;
+----+----------+
| id | level |
+----+----------+
| 1 | Grade 1 |
| 3 | Grade 2 |
| 2 | Grade 10 |
+----+----------+
3 rows in set (0.04 sec)
anzeigen Tabellenstruktur
MariaDB [yourschema]> show create table l;
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| l | CREATE TABLE `l` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`level` varchar(32) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
Fügen Sie eine virtuelle persistente Spalte:
MariaDB [yourschema]> ALTER TABLE l ADD level_int INT AS (SUBSTRING_INDEX(`level`,' ',-1)) PERSISTENT;
Query OK, 3 rows affected (1.90 sec)
Records: 3 Duplicates: 0 Warnings: 0
hinzufügen neue Zeilen:
MariaDB [yourschema]> insert into l (level) VALUES ('Grade 23'),('Grade 132');
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0
Alle Reihen undd sehen das Feld level_int
:
MariaDB [yourschema]> SELECT * FROM l ORDER BY substring_index(LEVEL,' ',-1)+0;
+----+-----------+-----------+
| id | level | level_int |
+----+-----------+-----------+
| 1 | Grade 1 | 1 |
| 3 | Grade 2 | 2 |
| 2 | Grade 10 | 10 |
| 4 | Grade 23 | 23 |
| 5 | Grade 132 | 132 |
+----+-----------+-----------+
5 rows in set (0.00 sec)
Jetzt können Sie einen Index hinzufügen und Abfrage der neuen Spalte:
MariaDB [yourschema]> alter table l add index idx_level_int (level_int);
Query OK, 5 rows affected (0.93 sec)
Records: 5 Duplicates: 0 Warnings: 0
MariaDB [yourschema]>
das Ergebnis ist korrekt. ist alphabetisch. Sie können ** ORDER BY SUBSTRING_INDEX (Level, '', -1) +0 ASC ** testen, um Ihr gewünschtes Ergebnis zu erhalten. –
@Bernd Bocken Vielen Dank. Ich habe das SUBSTRING_INDEX (x, x, n) +0 vorher nicht benutzt, aber das sollte zu meinem Wissen hinzufügen. Ich werde mehr darüber recherchieren. Ich schätze es. Das hat mein Problem gelöst. – p3ace
eine kleine Bemerkung: Dies ist sehr zeit eine vollständige Tabelle SCAN. Wenn Sie eine riesige Tabelle haben, ist es besser, die Tabelle zu ändern und ein virtuelles Feld hinzuzufügen, das die Zahl automatisch generieren kann, und Sie können auch einen Index für dieses Feld erstellen.Informieren Sie mich, wenn Sie weitere Informationen dazu wünschen –