Alternative ORDER BY - Anweisung in MySQL ?
Dieter
- datenbank
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
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
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
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
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
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
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
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
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):
In der Kontakthistorie lege ich u.a. folgende Werte ab:
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
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