Natural Sort?

Hallo,
ich möchte meine SQLAuslesung nach „laufnr“ natürlich sortiert haben.

die Abfrage lautet:
„SELECT * from fh_pr_ausschuss ORDER by laufnr“

Die Tabelle sieht aus wie folgt:
id | laufnr | text
1 | 1 | blubb
2 | 22.10 | bla
3 | 3.1 | jopp
etc.

Wie kann ich die natürlich sortieren ???
Ich hab in php.net nachgeschaut, bin aber zu keinem vernünftigen Ergebniss gekommen :frowning:

zumal im $dpo=mysql_fetch_array($abfrage) ja mehrere Werte neben laufnr vorhanden sind.

Muss ich da array_multisort machen ? Und dann natsort ??

Ich hab leider keine Ahnung, aber es wär toll. wenn mir da jemand n Tipp geben könnte ! :smile:

Danke !

Hallo Jan,

ich möchte meine SQLAuslesung nach „laufnr“ natürlich sortiert
haben.

die Abfrage lautet:
„SELECT * from fh_pr_ausschuss ORDER by laufnr“

Die Tabelle sieht aus wie folgt:
id | laufnr | text
1 | 1 | blubb
2 | 22.10 | bla
3 | 3.1 | jopp
etc.

Eigentlich werden die Daten natürlich sortiert. Dazu muss
allerdings der Feldtyp auch numerisch sein.

Anscheinend ist Deine laufnr vom Typ varchar o.ä., so dass
nicht die numerische Sortierung, sondern eine String-
Sortierung durchgeführt wird.

Wie kann ich die natürlich sortieren ???

Zwei Möglichkeiten:

  1. Ändere den Feldtyp auf Double(x,y)
  2. Folgende Abfrage verwenden:
    SELECT *, (laufnr * 1.0) AS neuelaufnr FROM fh_pr_ausschuss ORDER BY neuelaufnr
    Damit wird der Wert laufnr automatisch auf numerisch ge-‚casted‘.

Ich hab in php.net nachgeschaut, bin aber zu keinem
vernünftigen Ergebniss gekommen :frowning:

Ist ja auch ein SQL-Problem… :wink:

Danke !

Gern!

Gruss
Thomas

Steigerung möglich ?
Der erste Tipp war ja schonmal gut !

Allerdings klappt das ganze nicht, wenn
ich als laufnr etwa 2.3.1 habe :o(

Kann man dass dann auch noch natürlich sortieren lassen ?

Das Endergebnis ist halt ne typische Aufzählung in einem Dokument:

1.0 Überschrift
1.1 Kategorie
1.1.1 Unterkategorie
1.2 Kategorie
1.2.1 Unterkategorie

gibts da auch so ne elegante Lösung für?

Danke :smile:

Das Endergebnis ist halt ne typische Aufzählung in einem
Dokument:

1.0 Überschrift
1.1 Kategorie
1.1.1 Unterkategorie
1.2 Kategorie
1.2.1 Unterkategorie

gibts da auch so ne elegante Lösung für?

hab ich auch mal benoetigt, fuer warengruppen…
naja nicht elegant, aber das sollte tun:

<?php $foo = array('1.0','2.3','2.1.1','2.1.2','1.1');<br />
function wgsort($a,$b)
 {
 $a1 = 0;
 foreach ( explode('.',$a) as $len=\>$a)
 { $a1 += $a\*pow(10,10-$len\*2); }

 $b1 = 0;
 foreach ( explode('.',$b) as $len=\>$b)
 { $b1 += $b\*pow(10,10-$len\*2); }

 if ($a1 == $b1) return 0;
 return ($a1 \> $b1) ? +1 : -1;

 }


usort($foo,'wgsort');

print\_r($foo);

?\>

Hallo,
ich möchte meine SQLAuslesung nach „laufnr“ natürlich sortiert
haben.

die Abfrage lautet:
„SELECT * from fh_pr_ausschuss ORDER by laufnr“

Die Tabelle sieht aus wie folgt:
id | laufnr | text
1 | 1 | blubb
2 | 22.10 | bla
3 | 3.1 | jopp
etc.

Wie kann ich die natürlich sortieren ???
Ich hab in php.net nachgeschaut, bin aber zu keinem
vernünftigen Ergebniss gekommen :frowning:

zumal im $dpo=mysql_fetch_array($abfrage) ja mehrere Werte
neben laufnr vorhanden sind.

Sammle den ganzen Kram in einem Array:
while($d=mysql_fetch_array($abfrage))
$data[$d[‚laufnr‘]] = $d;

und lasse das dann mit uksort nach den Schlüsseln (also der laufnr) sortieren:
$data_neu = uksort($data, ‚version_compare‘);

version_compare ist zwar eigentlich für Versionsnummern, sollte aber das tun, was du willst. Ansonsten versuche da einmal strnatcmp, die Funktion kannte ich bis jetzt noch gar nicht…

Mit while(list(,$val)=each($data_neu)) echo $val[‚text‘];
kannst du dann die Daten weiterverarbeiten. Das ganze funktioniert nur so, wenn die laufnr eindeutig ist, ansonsten ist etwas mehr Code erforderlich…

Alexander