Micha Grünert: Sortierung (MySQL 5.0.32)

Hallo,

ich frage von meiner Datenbank Bildunterschriften ab, und sortiere die Ausgabe nach Aufnahmedatum und forlaufender Bild-Id:

$result = mysql_query("SELECT * FROM bildunterschriften ORDER BY datum DESC, id ASC");

Jetzt heissen die jeweils ersten Bilder z.B. "foto1" anstelle von "foto01", d.h. die Reihenfolge wäre

foto1
foto10
foto11
(...)
foto2

was echt blöd ist :)

Gibt es eine Möglichkeit, dies so zu ändern, dass 1-9 zuerst kommen OHNE das ich sie auf 01-09 ändere? Denn - und das ist der Haken - es gibt mehr Id's als nur "fotoXX", sondern auch z.B. "urlaub2007XX", und davon ziemlich viele. Also so ca. 400 mit 1-9 :(

Grüße und schöne Ostern

Micha

  1. so wie ich das sehe hast du in einer spalte deiner tabelle zwei informationen, nämlich den typen ("foto", "urlaub2007") und die "priorität"
    das verstößt gegen die 2. normalform von tabellen (ich glaub die 2. wars, bin mir nicht sicher) und ich würde dir auf jeden fall raten diese beiden werte in einzelne spalten zu lagern

    dein problem könntest du mit (aufwendigen) substr etc. pp. im sql statement lösen
    soweit mysql das kann wo ich mir nicht sicher bin
    wobei du dann auch probleme mit bezeichnungen wie eben "urlaub2007" hast, könnte man eventuell in gewissem rahmen mit regulären ausdrücken lösen wobei ich glaube das es spätestens hier die möglichkeiten von mysql sprengt und auch viel zu umständlich ist

    ich würde einfach eine neue spalten hinzufügen "orderId" in der du eben diesen wert speicherst

  2. echo $begrüßung;

    ich frage von meiner Datenbank Bildunterschriften ab, und sortiere die Ausgabe nach Aufnahmedatum und forlaufender Bild-Id:
    Jetzt heissen die jeweils ersten Bilder z.B. "foto1" anstelle von "foto01", d.h. die Reihenfolge wäre

    foto1
    foto10
    foto11
    (...)
    foto2

    was echt blöd ist :)

    Du möchtest das, was anderswo "natürliche Sortierung" (natural sort) genannt wird. MySQL bietet solch eine Möglichkeit nicht an.

    Gibt es eine Möglichkeit, dies so zu ändern, dass 1-9 zuerst kommen OHNE das ich sie auf 01-09 ändere?

    Ja. Die Namen foto1 bis foto9 unterscheiden sich von den foto10 bis foto99 darin, dass die Stringlänge eins weniger ist. Das gleiche Prinzip hast du bei Werten über 99.

    fotoX < fotoXY < fotoXYZ < ...

    Sortiere also zunächst nach der Länge des Namens und dann nach dem Namen selbst.

    Wenn allerdings "foto" immer unterschiedlich heißt, beziehungsweise du die Zugehörigkeit zu einer Serie anhand des ersten Teils festmachst, brauchst du noch ein weiteres Sortiermerkmal. Doch damit stößt du meines Wissens nach an die Grenze des mit MySQL machbaren, weil Reguläre Ausdrücke (um vom Anfang des Strings alle Buchstaben zu extrahieren) nur in der WHERE-Klausel, nicht aber in der ORDER BY-Klausel angewendet werden können. Du solltest dann die Serienzugehörigkeit anderweitig als über den Dateinamensanfang kennzeichnen.

    echo "$verabschiedung $name";

    1. Sortiere also zunächst nach der Länge des Namens und dann nach dem Namen selbst.

      SUPER!

      Das war die Lösung -> ORDER BY datum DESC, LENGTH(id) ASC, id ASC

      Geil! Danke!