Dieter: Alternative ORDER BY - Anweisung in MySQL ?

Hallo,

ich benutze eine MySQL-DB für die Kontaktdatenspeicherung bestehend u.a. aus Firmenname (nicht zwingend belegt), Vorname, Nachname, Anschrift usw..
Für die geordnete Ausgabe (auch verteilt über mehrere Seiten via LIMIT) gebe ich diese derzeit sortiert per ORDER BY nachname aus.
Nun stehe ich allerdings vor dem Problem, das es Datensätze in der DB gibt, die neben Vor- und Nachname auch einen Eintrag in der Spalte Firmenname haben und ich die Sortierung in einem solchem Fall anstatt per ORDER BY nachname -> ORDER BY Firmenname erfolgen soll.
Da ich aber ja keine zwei ORDER BY - Anweisungen in einer query fahren kann (oder doch, wenn ja, wie?) bitte ich um Hilfe diesbezüglich.

MfG
Dieter

  1. Hello,

    nutze die Ablauffunktionen, z.B. CASE um dir eine entsprechende künstliche Sortierspalte zu erzeugen, die entweder den Nachnamen oder den Firmennamen entählt.

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Ist Dir langweilig? Willst du Spaß? Willst Du Party? Ganz einfach!!! Schicke eine SMS mit dem Bestellwort "Feuer" an die 112 und innerhalb von 5 Minuten stehen 20 Männer mit lustigen Partyhüten, Sirenen und Partywagen vor deinem Haus!  --  Herkunft unbekannt
    1. Hallo nochmal,

      ich habe jetzt das Beispiel von Hopsel (vielen Dank dafür) eingebaut und es liefert mir auch die passenden Ergebnisse.
      Folgende query verwende ich:
      "SELECT * FROM db_kontakt WHERE firma LIKE '".$buchstabe."%' OR nachname LIKE '".$buchstabe."%' ORDER BY firma,nachname"
      Dazu habe ich aber leider noch eine kleine Frage...
      Obige query erzeugt nun eine fein säuberlich sortierte ausgabe wie:
      01 Achter, Markus
      02 Bergmann, Irene
      03 Muster, Max
      04 AAA Firma
      05 BBB Firma

      Ist es möglich, die Ausgabe derart umzustricken, das man folgendes Ergebnis bekommt:
      01 AAA Firma
      02 Achter, Markus
      03 BBB Firma
      04 Bergmann, Irene
      05 Muster, Max

      MfG
      Dieter

      1. Hello,

        Ist es möglich, die Ausgabe derart umzustricken, das man folgendes Ergebnis bekommt:

        dazu brauchst du jetzt wirklichen Vinzenz oder meine Lösung. Vinzenz Lösung funktioniert, sofern der Wert von Firmenname auf NULL steht wenn kein Firmenname existiert - falls auch ein leerer String '' als "kein Firmenname" betrachtet wird müsstest du dir entsprechend mit CASE WHEN etwas basteln.

        Das COALESCE sagt im Prinzip "nimm den ersten gefüllten Wert". In Kombination mit dem ORDER BY würdest du also pro Datensatz immer nach dem sortieren, was als erstes gefüllt ist, Nachname oder Firmenname, und diese dann allesamt untereinander sortieren.

        MfG
        Rouven

        --
        -------------------
        sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
        Vegetarier essen meinem Essen das Essen weg.
      2. Mahlzeit Dieter,

        Folgende query verwende ich:
        "SELECT * FROM db_kontakt WHERE firma LIKE '".$buchstabe."%' OR nachname LIKE '".$buchstabe."%' ORDER BY firma,nachname"

        Dann solltest Du Dich über SQL-Injection und deren Verhinderung (in PHP z.B. durch die Verwendung von mysql_real_escape_string()) informieren!

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
  2. Hi Dieter!

    ich benutze eine MySQL-DB für die Kontaktdatenspeicherung bestehend u.a. aus Firmenname (nicht zwingend belegt), Vorname, Nachname, Anschrift usw..

    Kannst du mal alle Spalten aufzählen? Ich sitze auch gerade an einer Kontaktverwaltung und bin mir immer noch nicht ganz schlüssig, welche Daten unbedingt gespeichert werden sollen. Gerne auch per Email.

    Nun stehe ich allerdings vor dem Problem, das es Datensätze in der DB gibt, die neben Vor- und Nachname auch einen Eintrag in der Spalte Firmenname haben und ich die Sortierung in einem solchem Fall anstatt per ORDER BY nachname -> ORDER BY Firmenname erfolgen soll.

    Schlechter Stil. Ich würde dem Nutzer bei Klick auf die Spaltenüberschrift die entsprechende Sortierung anbieten.

    Aber gibt es bei MySQL nicht die Möglichkeit mit "ORDER BY Firmenname, Nachname" mehrere Spalten, nach denen sortiert werden soll, anzugeben?

    MfG H☼psel

    --
    "It's amazing I won. I was running against peace, prosperity, and incumbency."
    George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
    Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
  3. Hallo,

    @HOPSEL: Ich sortiere die Ausgaben auch noch mit einem alphabetischem Index, von daher kein schlechter Stil :-). Ich war nur zu faul meine ganze query hier zu posten. Zu deiner Frage: Da die Kontaktverwaltung ziemlich Kundenspezifisch ist, ist eine allgemeine Aufzählung aller Spaltennamen dir sicher nicht hilfreich. Ich speichere neben komplettem Namen und Anschrift auch Ansprechpartnerdaten sowie Kontakthistorie um so zusammenhängende Kommunikationen besser darstellen zu können. Dabei ist die Kontakthistorie eine seperate Tabelle (Zuordnung per id).
    Dein Tip mit ORDER BY wert1, wert2 verstehe ich nicht so ganz, da ich ja nicht vor der Ausführung der query weiss, ob das Feld firmenname einen Wert hat. Würde dann eine query a'la "SELECT * FROM db_kontakt WHERE nachname LIKE '$buchstabe%' ORDER BY nachname, firmename LIMIT $start,$menge" nicht querschiessen ?

    @Rouven: Könntest du mir das mit CASE anhand meiner query bitte etwas näher erleutern ?

    query: "SELECT * FROM db_kontakt WHERE nachname LIKE '$buchstabe%' ORDER BY nachname LIMIT $start,$menge"

    MfG
    Dieter

    1. Hi Dieter!

      Da die Kontaktverwaltung ziemlich Kundenspezifisch ist, ist eine allgemeine Aufzählung aller Spaltennamen dir sicher nicht hilfreich.

      Es wäre trotzdem schön. Vielleicht kommt noch eine neue Spalte für mein Programm heraus. =)
      Hast du frei definierbare Felder?

      Ich speichere neben komplettem Namen und Anschrift auch Ansprechpartnerdaten sowie Kontakthistorie um so zusammenhängende Kommunikationen besser darstellen zu können. Dabei ist die Kontakthistorie eine seperate Tabelle (Zuordnung per id).

      Was wird denn in der Historie gespeichert? Da muss ja dann auch die Kontaktart (Email, Telefon, Treffen) definiert sein.

      Dein Tip mit ORDER BY wert1, wert2 verstehe ich nicht so ganz, da ich ja nicht vor der Ausführung der query weiss, ob das Feld firmenname einen Wert hat.

      Wenn "firmenname" keinen Wert hat, wird stattdessen nach dem Namen sortiert.
      Erst kommen also alle Einträge, die einen Wert bei "firmenname" haben. Dann folgen die Einträge, die keinen Wert bei "firmenname" haben sortiert nach den Namen.

      ORDER BY spalte1, spalte2 sortiert immer erst nach der ersten Spalte und dann nach der zweiten:
      Berlin        Achim
      Berlin        Bertha
      Berlin        Max
      Berlin        Siegfried
      Chemnitz      Anna
      Chemnitz      Hartmut
      Chemnitz      Markus
      Stuttgart     Heinz
      Stuttgart     Horst
      Stuttgart     Uta
      NULL          Bernd
      NULL          Richard
      NULL          Torben

      MfG H☼psel

      --
      "It's amazing I won. I was running against peace, prosperity, and incumbency."
      George W. Bush speaking to Swedish Prime Minister unaware a live television camera was still rolling, June 14, 2001
      Selfcode: ie:% fl:( br:> va:) ls:& fo:) rl:? n4:& ss:| de:] js:| ch:? sh:( mo:) zu:)
      1. Hallo Hopsel,

        wenn ich dich richtig verstehe müsste meine query ja dann derart aufgebaut sein:
        "SELECT * FROM db_kontakt WHERE firmenname LIKE '$buchstabe%' OR nachname LIKE '$buchstabe%' ORDER BY firmenname, nachname LIMIT $start,$menge"

        Zu den Daten...
        ich speichere in der kontakt-DB u.a. folgende Werte (spezielle KD-spezifische habe ich weggelassen):

        • interne_ktnr
        • bearbeiter
        • response aus
        • erfassungsdatum
        • letzterkontakt
        • anrede
        • titel
        • firmenname
        • vorname
        • nachname
        • strasse
        • ort
        • land
        • telefon
        • telefax
        • mobil
        • email
        • ansprechparter_anrede
        • ansprechparter_titel
        • ansprechparter_vorname
        • ansprechparter_nachname
        • ansprechparter_strasse
        • ansprechparter_ort
        • ansprechparter_land
        • ansprechparter_telefon
        • ansprechparter_telefax
        • ansprechparter_mobil
        • email
        • bevorzugte_kt_art
        • wiedervorlage
        • memo (statisch nicht fortführend)

        In der Kontakthistorie lege ich u.a. folgende Werte ab:

        • ktid (logisch, zuordnung zu kontakt)
        • bearbeiter
        • kontaktzeit
        • kontaktart
        • kontakttext

        Die Grundwerte für Bearbeiter stammen aus der aktuellen Login-Sitzung, die Werte für Response aus stammen aus seperater Tabelle da diese bei dem KD häufig variieren.
        Neben diesen Werten gibt es halt noch verschiedene KD-spezifische Werte wie Kontakt-Gruppe (Priv/Gew; bei Gew gibt es noch die Felder St-Nr bzw. int. St.-ID) oder Agentur usw...
        Das ganze stammt aus einem Buchungs-/Belegungs- und Rechnungssystem für Yachtcharter.

        Gruss
        Dieter

    2. Hallo,

      @Rouven: Könntest du mir das mit CASE anhand meiner query bitte etwas näher erleutern ?

      Einsatz von CASE, siehe Handbuch oder z.B. </archiv/2008/6/t173119/#m1136008>.

      Wenn sichergestellt ist, dass die Werte in der Spalte Firmenname den speziellen Wert NULL aufweisen, wenn kein Firmenname angegeben ist, dann könntest Du auch mit COALESCE arbeiten:

      ORDER BY  
          [link:http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#function_coalesce@title=COALESCE](firmenname, nachname)  
      
      

      Freundliche Grüße

      Vinzenz