ORDER BY scheint nicht zu funktionieren
Ares
- datenbank
Hallo,
ich habe eine kleine Datenbank geschrieben in der ich meine DVDs verwalte und bei der ich mit PHP Einträge erstelle und suchen kann.
So weit so gut.
Allerdings habe ich festgestellt, dass die Einträge nach dem Primärschlüssel sortiert ausgegeben werden, ich möchte sie aber nach dem Feld 'nummer' sortiert haben ('nummer' ist kein rein numerischer Wert, da ich teilweise auch Buchstaben vorsetze)
Folgender Befehl geht an die Datenbank
SELECT * FROM filme WHERE $suchfeld LIKE '%$suchstring%' ORDER BY 'nummer' ASC
Was mache ich falsch, da das Ergebnis immernoch nach dem Primäschlüssel sortiert ausgegeben wird?
Ares
SELECT * FROM filme WHERE $suchfeld LIKE '%$suchstring%' ORDER BY 'nummer' ASC
Du könntest genauso ORDER BY 42 ASC
schreiben, hätte den selben Effekt. Da du nach einem in jedem Datensatz gleichen String sortierst, wird dieser auf die Sortierung keinen Einfluss haben.
Wenn du nach der Spalte "nummer" sortieren wolltest, lass die Anführungsstriche weg.
Gruß,
Andreas
SELECT * FROM filme WHERE $suchfeld LIKE '%$suchstring%' ORDER BY 'nummer' ASC
Du könntest genauso
ORDER BY 42 ASC
schreiben, hätte den selben Effekt. Da du nach einem in jedem Datensatz gleichen String sortierst, wird dieser auf die Sortierung keinen Einfluss haben.
Wenn du nach der Spalte "nummer" sortieren wolltest, lass die Anführungsstriche weg.Gruß,
Andreas
Hilfe ist das peinlich wie einfach mein Fehler war :(
Danke!
Nun wird sortiert, aber leider kommen die Ergebnisse in der Reihenfolge
1
10
100
101
...
kann ich das so
1
2
3
...
10
11
12
...
100
101
sortieren lassen, ohne dass ich
001
002
...
als Nummer schreiben muss?
Gruß
Ares
Hallo,
SELECT * FROM filme WHERE $suchfeld LIKE '%$suchstring%' ORDER BY 'nummer' ASC
Hilfe ist das peinlich wie einfach mein Fehler war :(
Danke!
1
10
100
101
...
das liegt an Deinem Tabellendesign.
kann ich das so
1
2
3
...
10
11
12
...
100
101
sortieren lassen, ohne dass ich
Verwende statt des zusammengesetzten Wertes zwei Spalten, eine für die vorgesetzten Buchstaben, eine für ganze Zahlen mit entsprechendem Typ.
Freundliche Grüße
Vinzenz
Hallo
Verwende statt des zusammengesetzten Wertes zwei Spalten, eine für die vorgesetzten Buchstaben, eine für ganze Zahlen mit entsprechendem Typ.
Freundliche Grüße
Vinzenz
Ok hab die Buchstaben in die Spalte 'prefix' geschrieben und die Nummer als int gesetzt.
Nun habe ich nur das Problem, dass ich beim Eintragen einer DVD der Nummer ein Duplikat-Fehler auf der Nummer bekomme.
Ich habe aber den Index schon auf prefix UND nummer erweitert.
Eigentlich sollte der Fehler nun nicht auftreten, oder muss ich die ganze Tabelle nochmal neu schreiben um den alten Index vollständig zu überschreiben?
Gruß
Ares
echo $begrüßung;
Bitte nur die relevanten Teile zitieren, auf die du dich beziehst. Danke.
Ok hab die Buchstaben in die Spalte 'prefix' geschrieben und die Nummer als int gesetzt.
Nun habe ich nur das Problem, dass ich beim Eintragen einer DVD der Nummer ein Duplikat-Fehler auf der Nummer bekomme.
Beschreibe die Umstände bitte genauer.
Ich habe aber den Index schon auf prefix UND nummer erweitert.
Nicht dass du da einen Fehler gemacht hast. Wie sieht die Struktur jetzt aus? (SHOW CREATE TABLE name)
Eigentlich sollte der Fehler nun nicht auftreten, oder muss ich die ganze Tabelle nochmal neu schreiben um den alten Index vollständig zu überschreiben?
Wenn der Unique/Primar-Index beim Umschreiben stört, entfern ihn und füge ihn anschließend wieder hinzu.
echo "$verabschiedung $name";
Es klappt jetzt.
Ich hatte einen Fehler in PHP, wobei der Wert für prefix nicht ordentlich übergeben wurde. Daher, da prefix leer war, hat er natürlich die vorhandene DVD 100 nicht von der neuen unterscheiden können und gemeckert.
Jetzt läuft es aber flüssig und wunderbar :)
Vielen herzlichen Dank für eure Hilfe
Schönes Wochenende noch
Ares
Hi,
Nun wird sortiert, aber leider kommen die Ergebnisse in der Reihenfolge
1
10
100
Deine Spalte nummer scheint ein String zu sein. Warum?
Wenn dort nur Nummern enthalten sind, bietet sich eine numerische Spalte statt einer String-Spalte an.
Wesentlich ineffizienter, aber auch möglich, wäre ein typecast vor der Sortierung (wie der genau aussieht, hängt vom DB-System ab - da Du nicht gesagt hast, was Du benutzt, mußt Du jetzt eben selbst im Handbuch Deines Systems danach suchen).
cu,
Andreas
echo $begrüßung;
Nun wird sortiert, aber leider kommen die Ergebnisse in der Reihenfolge
1
10
100
kann ich das so
1
2
3
10
11
12
sortieren lassen, ohne dass ich
001
002
als Nummer schreiben muss?
Das geht nur dann, wenn dein DBMS die so genannte Natural Sort Order unterstützt. MySQL kann das nicht. Neben der von Vinzenz vorgeschlagenen günstigeren Tabellenstrukturierung gibt es weitere Alternativen.
Du schreibst dir für dein DBMS eine Funktion, die dir den sortierfähigen Wert zurückliefert, also aus A1 ein A001 macht, und gibst die als Sortierkriterium an.
Du sortierst in PHP mit usort() und strnatcmp()/strnatcasecmp(). Das setzt voraus, dass du die Ergebnismenge komplett abgeholt und zwischengespeichert hast. Bei einer "haushaltsüblichen" DVD-Sammlung dürfte der dabei anfallende zusätzliche Speicherverbrauch problemlos verkraftbar sein.
echo "$verabschiedung $name";
Hi,
Allerdings habe ich festgestellt, dass die Einträge nach dem Primärschlüssel sortiert ausgegeben werden,
Nein, sie kommen in zufälliger Reihenfolge.
SELECT * FROM filme WHERE $suchfeld LIKE '%$suchstring%' ORDER BY 'nummer' ASC
Dieses SQL-Statement dürfte eine Fehlermeldung erzeugen, da $suchfeld in der WHERE-Clause nicht sinnvoll ist.
Merke: Für SQL-Probleme ist PHP-Code irrelevant.
Was mache ich falsch,
Du sortierst nach dem String 'nummer' statt nach der Spalte nummer.
cu,
Andreas