Anzeige
Tutorialbeschreibung

Natural Sort mit MySQL und PHP

Natural Sort mit MySQL und PHP

Oftmals steht man vor dem Problem, dass man die Daten einer MySQL-Tabelle sortieren möchte, und zwar so, dass auch gemischte (alphabetische und numerische) Werte nach den allgemeinen Regeln (natürlich = natural) sortiert werden. Dieses Tutorial zeigt eine einfache und kurze, aber sehr effektive Methode, dies zu verwirklichen.


Um Werte einer MySQL-Abfrage alphanumerisch, also sowohl alphabetisch nach Buchstaben als auch numerisch nach Zahlen zu sortieren, bedarf es eines speziellen Abfrage-Codes.


Problematik:

Nehmen wir einmal an, dass es sich um eine Spalte vom Typ VARCHAR oder CHAR handelt. In diese können sowohl Zahlen als auch Buchstaben oder eine Mischung aus beiden eingetragen werden. Sortiert man nun die Werte bei der Abfrage mit der gewöhnlichen ORDER BY-Methode, erhält man unter Umständen eine nicht natürliche Reihenfolge der Werte.


Schritt 1:

Im ersten Schritt legen wir zunächst einmal die Tabelle 'tabelle' mit der Spalte 'EINTRAEGE' an. Diese Tabelle wird für die folgenden Schritte unser Grundgerüst zum Testen der Funktionen sein.

Fügt nun bitte in die Tabelle die Werte 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 20 in beliebiger Reihenfolge ein.


Schritt 2:

Im zweiten Schritt versuchen wir nun, die Daten aus der Tabelle mit der Standard-Funktion ORDER BY zu sortieren und uns anzusehen. Bitte legt dazu nun die Datei 'index.php' an und füllt sie mit folgendem Code:


<?php

//Hier muss noch die Datenbankverbindung eingefügt werden...

//Der erste Code:
$SQL = "SELECT `EINTRAEGE` FROM `tabelle` ORDER BY `EINTRAEGE`";
$RES = mysql_query($SQL);

while($data = mysql_fetch_array($RES)){

 echo $data['EINTRAEGE'] . ",";

}

?>

Natürlich müsst ihr noch die Verbindung zur Datenbank im Vorfeld einfügen. Nutzt als Hilfe die diversen Tutorials im Internet.

Ruft nun die Datei 'index.php' auf und seht euch die Ausgabe an. Der Code liefert euch unsere Datenbankwerte wie folgt:

1, 10, 11, 2, 20, 3, 4, 5, 6, 7, 8, 9

Wie ihr seht, handelt es sich nicht um eine natürliche, sondern um eine alphabetische Reihenfolge der Zahlenwerte. Es wird zunächst nach der ersten Ziffer, dann nach der zweiten Ziffer, der dritten Ziffer, etc. sortiert.

Hat man in einer Spalte definitiv nur Zahlenwerte, kann dieses Problem damit gelöst werden, dass man den Spaltentyp von CHAR oder VARCHAR auf INT ändert. Allerdings kann diese Spalte dann auch nur noch Zahlen beinhalten; Buchstaben werden automatisch entfernt.

Dies entspricht natürlich nicht unseren Anforderungen.


Schritt 3:


Nun versuchen wir es mal mit folgendem Code: Er beinhaltet einige kleine Anpassungen, die nachfolgend noch erläutert werden.
<?php

//Hier muss noch die Datenbankverbindung eingefügt werden...

//Der zweite Code
$SQL = "SELECT `EINTRAEGE` FROM `tabelle` ORDER BY CAST(`EINTRAEGE` AS DECIMAL) ASC, CAST(`EINTRAEGE` AS CHAR) ASC";
$RES = mysql_query($SQL); 

while($data = mysql_fetch_array($RES)){ 

 echo $data['EINTRAEGE'] . ","; 

} 

?>

Ruft nun die Datei 'index.php' auf und seht euch die Ausgabe an. Der Code liefert euch unsere Datenbankwerte wie folgt:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 20

Wie ihr seht, bekommen wir nun die gewünschte Ausgabe. Wir können nun auch noch Buchstaben oder Buchstaben-Zahlen-Kombinationen einfügen. Versucht beispielsweise folgende Werte:

a,1,bbd,33,5,zahlen,bugs,bunny,100.5


Erklärung zum Code:

Die Funktion CAST() wandelt den Typ der Tabelle für die Sortierung in den angegebenen Typ vorübergehend um, ohne dabei die Werte zu beeinflussen. Als Erstes wird der Typ auf DECIMAL gesetzt, um eine ordentliche Zahlenreihenfolge zu erzielen. Anschließend folgt eine erneute Typwandlung in CHAR. Nun wird alphabetisch sortiert.

Der Trick liegt darin, dass bei der ersten CAST-Anweisung alle Buchstabenwerte NULL werden und nicht sortiert werden können. Von der zweiten CAST- und ORDER-Anweisung sind dann lediglich diese betroffen, die erste Ordnung bleibt erhalten und wird lediglich durch die zweite ergänzt.



DVD-Werbung
Kommentare
Achtung: Du kannst den Inhalt erst nach dem Login kommentieren.
Portrait von CastorTroy85
  • 08.02.2011 - 09:18

Wow, danke das hilft mir sicher auch irgendwann weiter.

Portrait von K-Dawg
  • 29.01.2011 - 17:26

Muss mich meine Vorredner anschließen. Sehr guter Tutorial.
Gut erklärt und sogar was Neues gelernt. Das mit dem Casten war mir auch neu.

Gruß

Portrait von chris213
  • 28.01.2011 - 10:08

kurz und knackig - danke

Portrait von cyberian90
  • 25.01.2011 - 18:26

@mwxx:
Danke für die Blumen!

@mfgleo:
Ich habe leider keine Erfahrung mit so großen Datenmengen. Wenn du es versuchen möchtest, kannst du dein Ergebnis gerne mal hier zum Besten geben, würde mich freuen ;-)

@dlogic:
Vielleicht kannst du's ja mal nutzen...

Portrait von dlogic
  • 24.01.2011 - 20:50

Bisher kannte und benötigte ich diese Sortierung nicht. Aber gut zu wissen. Danke.

Portrait von mfgleo
  • 24.01.2011 - 08:57

Interessanter Ansatz. Wie sieht es jedoch mit der Performance bei großen Datenmengen (ca. 1 Million Sätze ) aus? Hast Du evtl. Erfahrungen hierzu gemacht?

Portrait von mwxx
  • 24.01.2011 - 05:51

Scharfe Sache !
Nachdem ich mal sowas in PHP zur nachträglichen Sortierung in dieser Art gebaut hatte, rein zweckdienlich, aber nicht elegant, ist das hier richtig schick.Ich wusste bis eben gar nicht, dass man schon in SQL Typecasting machen kann.
Danke - man lernt nie aus

x
×
×