2016-07-07 3 views
0

Ich verwende MySQL Workbench als IDE zum Erstellen meiner Tabellen. Ich habe eine gespeicherte Prozedur erstellt, um alle Zeilen der Spalte level anzuzeigen, und habe versucht, die Ergebnismenge in aufsteigender Reihenfolge anzuordnen. level Spalte ist eine Varchar-Spalte.ORDER BY ASC wird nicht richtig wirksam auf String mit der Nummer

CREATE DEFINER=`root`@`localhost` PROCEDURE `getAllYearLevels`() 
BEGIN 
    SELECT `level` FROM yearlevel ORDER BY `level` ASC; 
END 

Aber wenn ich ein CALL zum getAllYearLevels Verfahren durchführen, ist es das Ergebnis mit Grad 10 als zweite Zeile zurückgeben statt Grade 2.

call enrollmentdb.getAllYearLevels(); 

enter image description here

Ich weiß, das ist sehr einfach zu den meisten, aber ich habe nur keine Ahnung, wie das zu korrigieren ist. Ich habe die korrekte Syntax zum Ordnen der Ergebnismenge verwendet. Ich dachte, vielleicht wird der Wert von varchar benötigt, aber ich weiß nicht, wie man es auseinander bricht. Oder vielleicht ist Casting nicht notwendig.

Ich würde jede Hilfe zu schätzen wissen.

Danke.

+3

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. –

+0

@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

+0

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 –

Antwort

1

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]> 
+0

Danke nochmal. Ich schätze die Beispiele. Es ist sehr einfach zu folgen und zu verstehen. Dies wird mir bei zukünftigen Projekten helfen, weil ich wirklich Zeit mit meinen Prozeduren und der Tabellendefinition verbringe. :) – p3ace

1

Ich schlage vor, die Ebene so zu ändern, dass sie nur Zahlen enthält und dem Ergebnis den Text "Grade" hinzufügt. Wenn Sie dann in der neuen numerischen Spalte sortieren, erhalten Sie die gewünschte Reihenfolge.

+0

Danke. Ja, ich nehme den Vorschlag zur Kenntnis. – p3ace

1

Angesichts Ihrer Daten, wahrscheinlich der einfachste Weg ist durch Länge und dann durch den Wert zu sortieren:

ORDER BY LENGTH(`level`), `level 
+0

Danke für die Antwort. – p3ace

1

Fehler beim Schemadesign ... Speichern Sie nicht "Grade 1" in einer String-Spalte, speichern Sie "1" in einer numerischen Spalte. Zeigen Sie bei der Anzeige bei Bedarf "Note" an.

+0

Danke. Ich merkte, dass das Speichern der Nummer besser ist, nachdem ich die Vorschläge gesehen habe. – p3ace

Verwandte Themen