SQL Abfrage: alphabetische Ordnung nach 2.Wort im String
anuschka
- datenbank
Hallo,
passe ein CMS (PHP und MySQL) an, leider ist in diesem CMS für "Name" nur eine Spalte (für Vor- und Zunamen) in der Datenbank vorgesehen, der Name taucht an 1000 Stellen auf, und ich habe keine Lust, eine neue Spalte einzuführen. Jetzt das Problem: die Namen sollen nach dem Nachnamen geordnet werden (alphabetisch), der dummerweise an 2.Stelle steht.
Also: Gibt es ein SQL Abfrage-Möglichkeit, eine alphabetische Anordnung der Datensätze vorzunehmen, geordnet nach dem letzten Wort eines Strings?
Liebe Grüße
Anuschka.
Huhu Anuschaka
Also: Gibt es ein SQL Abfrage-Möglichkeit, eine alphabetische Anordnung der Datensätze vorzunehmen, geordnet nach dem letzten Wort eines Strings?
Eine einfache Variante wäre
SELECT SUBSTRING( name, Locate( ' ', name ) ) AS Nachname
FROM DeineTabelle
ORDER BY Nachname
das funktioniert aber nur bei Namen mit genau einem Vornamen.
Und wenn auch genau ein Leerzeichen verwandt wurde.
Guck mal da, welche String-Funktionen Dir noch zur Verfügung stehen.
http://dev.mysql.com/doc/mysql/en/String_functions.html
zur Not musst den String zweimal per REVERSE umdrehen, falls es keine
Funktion gibt welche die letzte Position von ' ' zurückgibt.
Allerdings würde ich Dir raten doch eine zweite Spalte einzuführen.
Alles andere ist nur "Rumgemurxe" und der nächste der es bearbeiten muss freut sich auch.
Falls Du nicht gleich alle Templates etc. überarbeiten willst reicht es ja vielleicht die SQL-Querys anzupassen also z.B.
SELECT concat_ws(' ',SpalteVorname, SpalteNachname) as Name
Viele Grüße
lulu
Hello Lulu,
Eine einfache Variante wäre
leider auch eine falsche...
SELECT SUBSTRING( name, Locate( ' ', name ) ) AS Nachname
FROMDeineTabelle
ORDER BY Nachnamedas funktioniert aber nur bei Namen mit genau einem Vornamen.
Und wenn auch genau ein Leerzeichen verwandt wurde.
Dein Glück, dass Du noch darauf hingewiesen hast *gg*
Wie geht es sonst so?
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Huhu Tom
Dein Glück, dass Du noch darauf hingewiesen hast *gg*
Phhuu, auf der Linie gerettet :)
Aber substring_index() kannte ich noch nicht.
Wie geht es sonst so?
Och soweit ganz gut, nur das doofe Internet nervt mich z.Zt.(spitzfindige Leute könnten jetzt fragen warum ich dann gerade "drin" bin).
Im Moment könnte ich mir gut einen Job als Imker oder so vorstellen, naja verklärte, realitätsfremde Landromantik eben.
Viele Grüße
lulu
Hello,
Man kann nicht alles kennen ;-) aber die Funktion ist ganz pfiffig. Würde mich interessieren, ob andere SQL-Dialekte sowas auch kennen.
Och soweit ganz gut, nur das doofe Internet nervt mich z.Zt.(spitzfindige Leute könnten jetzt fragen warum ich dann gerade "drin" bin).
Im Moment könnte ich mir gut einen Job als Imker oder so vorstellen, naja verklärte, realitätsfremde Landromantik eben.
Siehst Du, deshalb bin ich hier auf den Berg gezogen.
Und nun habe ich schon wieder einen "Internetauftrag" im benachbarten Tal und gurke da jeden Tag runter. Im Winter mit dem Bus, im Sommer mit dem Rad. Da brauche ich nur 7' länger, als der Bus, und muss nicht schon um 06:42 los. Rauf braucht der Bus aber auch nur 25' und ich nehme die lange Strecke am Oderstausee lang. Da brauche ich dann 1:37' für 20km und 340m Höhenunterschied. Für Tour de France reicht es also noch lange nicht ;-)
Lass mal wieder von dir _hören_
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hello,
passe ein CMS (PHP und MySQL) an, leider ist in diesem CMS für "Name" nur eine Spalte (für Vor- und Zunamen) in der Datenbank vorgesehen, der Name taucht an 1000 Stellen auf, und ich habe keine Lust, eine neue Spalte einzuführen. Jetzt das Problem: die Namen sollen nach dem Nachnamen geordnet werden (alphabetisch), der dummerweise an 2.Stelle steht.
Also: Gibt es ein SQL Abfrage-Möglichkeit, eine alphabetische Anordnung der Datensätze vorzunehmen, geordnet nach dem letzten Wort eines Strings?
es gibt
Substring(string,pos,len)
Right(String,len)
InStr(string,substr)
Substring_Index(string,find,number) <-- das arbeitet auch von hinten!
Daraus solltest Du das eigentlich basteln können.
Bedenke, dass MySQL ( auch bei InStr() ) mit 1 anfängt zu zäheln und 0 bedeutet, dass das Zeichen nicht im String enthalten ist.
Es wird dich aber enorm viel Performance kosten.
Besser wäre es also, die Spalte Nachname
einzuführen und dann einmal ein Reparaturtool dafür zu erstellen.
Nachname = substring_index(trim(string),' ',-1)
sollte also Deine Lösung sein.
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
Hello,
dank Euch für Eure Hilfe.
Habe jetzt eine viel einfachere Lösung ohne Risiko gefunden: Die alte Spalte mit dem Vor- und Zunamen bleibt erhalten und somit alle Abfragen im CMS, die Spalte wird aus den neuen Spalten Vorname und Zuname beim Anlegen eines Nutzers automatisch gefüllt.
Grüße
Anuschka