Mysql Sortierung Problem mit Sonderzeichen
Kermit
- datenbank
Hallo,
arbeite mit MySql 4.0 und PHP.
Habe eine Abfrage die ich nach Namen aufsteigend sortieren lasse.
Soweit so gut. Nun habe ich aber einen Sonderfall bei dem der Namen nicht mit einem Buchstaben sondern mit einem Sonderzeichen beginnt (in meinem Fall mit einer eckigen Klammer [Namen]). Dieser Namen wird natürlich ans Ende der Liste sortiert.
Gibt es eine Möglichkeit, daß bei der Sortierung das Sonderzeichen "übersehen" wird und der Namen nach dem ersten "realen" Buchstaben ins Alphabet einsortiert wird - und wenn ja, welche?
Zum besseren Verständnis:
Albert
Berta
Dora
Kermit
[Cäsar]
sollte als
Albert
Berta
[Cäsar]
Dora
Kermit
sortiert werden (wichtig dabei ist, daß bei der Anzeige die Sonderzeichen trotzdem angezeigt werden)
Hoffe Ihr könnt mr helfen und vielen Dank schon mal,
Kermit
hi,
Gibt es eine Möglichkeit, daß bei der Sortierung das Sonderzeichen "übersehen" wird und der Namen nach dem ersten "realen" Buchstaben ins Alphabet einsortiert wird - und wenn ja, welche?
Dazu müsstest du ein bisschen mit den Stringfunktionen von MySQL herumbasteln, und dir selbst einen Wert "schaffen", nach dem dann sortiert wird.
Beispielsweise erst mal nach dem ersten Auftreten eines "richtigen" Zeichens (Buchstabe) suchen, und dann den Inhalt nur ab da betrachten.
Dann ggf. auch noch überlegen, was mit weiteren folgenden Sonderzeichen passieren soll, und eine Behandlung für den eventuellen Fall, dass der Spalteninhalt mal ausschließlich aus Sonderzeichen bestünde.
gruß,
wahsaga
Hi wahsaga,
erstmal danke für den Hinweis.
Habe mir die Stringfunktionen schon mal durchgeschaut aber irgendwie nichts befriedigendes gefunden.
Man kann zwar mit replace oder besser trim das entsprechende Sonderzeichen finden und entfernen - aber in der Ausgabe muß es ja trotzdem vorkommen... Außerdem wie Du schon sagtest wäre das nur eine kurzfristige Lösung, da es nur die von mir vordefinierten Sonderzeichen enthält und keine zukünftige Problemfälle berücksichtigt...
Wie würde man den "richtige" Zeichen (Buchstaben) vernünftig definieren?
Falls Zahlen im Namen vorkommen wäre es absolut ok, wenn diese Namen am Anfang der Liste stehen, da das ja Usus ist.
Danke und Grüße,
Kermit
hi,
Man kann zwar mit replace oder besser trim das entsprechende Sonderzeichen finden und entfernen - aber in der Ausgabe muß es ja trotzdem vorkommen...
Ich sagte nicht, dass du den Originalwert verändern, sondern dass du dir zum sortieren einen neuen "schaffen" sollst.
Ob du das nun in der Query machst, oder wie von dedlfix vorgeschlagen, gleich in der Tabelle hinterlegst, sei dir überlassen (ja, ich sehe in seinem Vorschlag auch eine deutlichen Performancevorteil).
Außerdem wie Du schon sagtest wäre das nur eine kurzfristige Lösung, da es nur die von mir vordefinierten Sonderzeichen enthält und keine zukünftige Problemfälle berücksichtigt...
Dann definiere, dass _alles_ ein Sonderzeichen ist, was nicht in einer von dir definierten Menge "normaler" Zeichen liegt.
Wie würde man den "richtige" Zeichen (Buchstaben) vernünftig definieren?
Falls Zahlen im Namen vorkommen wäre es absolut ok, wenn diese Namen am Anfang der Liste stehen, da das ja Usus ist.
Na also, damit hast du doch deine Definition bereits - Buchstaben und Ziffern Hui, alles andere Pfui.
"Alles andere" am Anfang, ggf. auch Ende und mittendrin, zu entfernen, sollte mittels regulärer Ausdrücke nicht allzu schwierig sein.
gruß,
wahsaga
echo $begrüßung;
Gibt es eine Möglichkeit, daß bei der Sortierung das Sonderzeichen "übersehen" wird und der Namen nach dem ersten "realen" Buchstaben ins Alphabet einsortiert wird - und wenn ja, welche?
Dazu müsstest du ein bisschen mit den Stringfunktionen von MySQL herumbasteln, und dir selbst einen Wert "schaffen", nach dem dann sortiert wird.
Dazu gibt es auch noch die Methode, eine Sortierspalte anzulegen, die dann gleich den/einen sortierbaren Wert enthält. Der Mehraufwand beim Dateneinpflegen ist oft geringer als der Zeitaufwand beim Suchen, wenn ständig dieser Wert neu berechnet werden muss.
echo "$verabschiedung $name";
Hi dedlfix,
auch über diese Lösung hatte ich schon nachgedacht, aber es kann doch nicht Sinn der Datenbank sein, dass ich mehr oder weniger den gleichen Inhalt zweimal in die Tabelle schreibe... Das wäre je komplette Doppelung der Namensspalte (und man müßte sie komplett doppeln um eine richtige Sortierung zu gewährleisten - z.B. Sophie und Sophia)
Grüße,
Kermit
hi,
auch über diese Lösung hatte ich schon nachgedacht, aber es kann doch nicht Sinn der Datenbank sein, dass ich mehr oder weniger den gleichen Inhalt zweimal in die Tabelle schreibe... Das wäre je komplette Doppelung der Namensspalte (und man müßte sie komplett doppeln um eine richtige Sortierung zu gewährleisten - z.B. Sophie und Sophia)
Datenredundanz ist natürlich wo immer sinnvoll möglich zu vermeiden.
Aber es gibt Ausnahmen, und dein Fall könnte durchaus so eine sein. Den zu vergleichenden Text mit Stringfunktionen umzuwandeln, kostet immer - und wenn du das jedes Mal in der Query machst, die die sortierte Liste liefern sollte, könnte diese und damit auch der Rest der Seite um einiges langsamer werden.
gruß,
wahsaga
echo $begrüßung;
auch über diese Lösung hatte ich schon nachgedacht, aber es kann doch nicht Sinn der Datenbank sein, dass ich mehr oder weniger den gleichen Inhalt zweimal in die Tabelle schreibe... Das wäre je komplette Doppelung der Namensspalte (und man müßte sie komplett doppeln um eine richtige Sortierung zu gewährleisten - z.B. Sophie und Sophia)
Nun, wenn die Datenbank keine andere Möglichkeit bereitstellt oder diese Datendopplung einfach performanter ist, warum sollte man das dann nicht anwenden? Ich kann in dem Fall nichts Verwerfliches drin sehen.
Wenn ich mich recht erinnere hat ein bekannter Bilderdienst mit hohen Zugriffszahlen eine ganze Tabelle (oder mehrere) dupliziert, weil MySQL mit InnoDB zwar Transaktionen anbietet aber Volltextsuche nur mit MyISAM. Änderungen kommen in die InnoDB-Tabelle, die in die nur für Lesezugriffe verwendete MyISAM-Tabelle kopiert/repliziert wird. Auch sonst wird dort aus Geschwindigkeitsgründen (teilweise/generell?) auf Normalisierung verzichtet (Siehe die PDF-Datei auf http://www.afup.org/article.php3?id_article=297)
echo "$verabschiedung $name";
Nun, wenn die Datenbank keine andere Möglichkeit bereitstellt oder diese Datendopplung einfach performanter ist, warum sollte man das dann nicht anwenden? Ich kann in dem Fall nichts Verwerfliches drin sehen.
Hi,
nein verwerflich finde ich es auch nicht - habe selber kein wirkliches Problem damit, nur in diesem Fall habe ich endlich mal eine Datenbank gebaut die (fast) ohne Redundanz auskommt und ewig verstrickt ist, mit vielen Zuordnungstabellen um bestmögliche Normalisierung zu erhalten - da hat mich der Vorschlag eher irritiert.
Aber vermutlich hast Du Recht, man kann es mit der Normalisierung auch übertrieben und wenn am Ende die Performance auf der Strecke bleibt ist auch keinem geholfen.
Grüße,
Kermit
hi,
Aber vermutlich hast Du Recht, man kann es mit der Normalisierung auch übertrieben und wenn am Ende die Performance auf der Strecke bleibt ist auch keinem geholfen.
Das ist ja auch einer der Gründe, warum man in der Praxis idR. die Normalisierung nicht "auf die Spitze" treibt, sondern sich mit (maximal) der dritten NF "begnügt".
gruß,
wahsaga