anuschka: SQL Abfrage: alphabetische Ordnung nach 2.Wort im String

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.

  1. 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

    --
    bythewaythewebsuxgoofflineandenjoytheday
    1. Hello Lulu,

      Eine einfache Variante wäre

      leider auch eine falsche...

      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.

      Dein Glück, dass Du noch darauf hingewiesen hast *gg*

      Wie geht es sonst so?

      Harzliche Grüße aus http://www.annerschbarrich.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      Nur selber lernen macht schlau
      1. 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

        --
        bythewaythewebsuxgoofflineandenjoytheday
        1. 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

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
  2. 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

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. 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