MySQL: ORDER BY

Acer82

Grünschnabel
Hallo erstmal,
Ich steh grad auf dem Schlauch mit einer SQL-Abfrage. Leider bin ich auch nicht der beste Datenbank-Profi... naja, egal :-D
Zu meinem Problem. Ich habe eine Nutzerdatenbank, in der u.a. auch die Postleitzahl und der Ort eines Nutzers gespeichert sind. Nun habe ich ein Suchskript, mit dessen Hilfe man Personen aus einem bestimmten Ort suchen kann. Da noch nicht wirklich viele Nutzer auf der Plattform sind, möchte ich dabei gleich eine Umgebungssuche einbinden, die Orte mitsucht, die die gleichen Zahlen an den ersten beiden Stellen der PLZ besitzt.

Mal ein Beispiel:
NutzerX hat als Ort "Leipzig" und als PLZ "04229"
Dann sähe die Suchabfrage wie folgt aus:
SELECT * FROM user WHERE ort LIKE 'Leipzig' OR plz LIKE '04%' ORDER BY plz, userid

Das klappt mehr oder weniger gut. Das Problem ist eben bloß, dass, wenn ein Ort eine höhere PLZ hat, erst andere Orte im Suchergebnis kommen und dann erst der eigentlich gesuche Ort. Ich habe daher schon eine Abfrage im PHP, wo alle PLZs, die höher als 5 sind, mit DESC sortiert werden und ansonsten ASC. Aber dennoch ist das Suchergebnis nicht zufriedenstellend.

Meine Frage (na endlich, was?):
Wie kann ich die Abfrage optimieren, dass er mir erst alle Einträge aufzählt, die den eigentlichen Ort beinhalten (also im obigen Beispiel erst alle mit Leipzig) und dann den Rest der PLZ-Suche (also oben alle anderen, die auch '04' an der PLZ haben).
Schön, wäre auch, wenn innerhalb der beiden Abschnitte nach userid DESC mit sortiert würde, so dass die jeweils neuesten Nutzer als erstes kommen.

Ich hoffe, ich hab mich nicht allzu beknackt ausgedrückt und bedanke mich schonmal für eure Antworten...

Nette Grüße aus Leipzig (wer hätte das gedacht *g*)...
Acer82
 
Hallo Acer82,

deine Frage ist verständlich!

Entweder löst du das in PHP mit 2 Abfragen. Da holst du dir erst die Datensätzen mit der genauen PLZ und dann die Datensätze aus der Umgebungssuche. Dann hast du aber das Problem mit doppelten Einträgen, die du dann filtern müstest.

Mit einem Select bekommst du das auch nicht so einfach hin.
Du kannst aber UNION ALL benutzen. UNION ALL filtert dabei die doppelten Datensätze raus.

Dann brauchst du nur noch für die richtige Sortierung sorgen. Das kannst zu z.B. mit einem extra Sortierungsfeld.
Code:
 SELECT Feld1, Feld2, Feld3, 1 as Sort FROM user WHERE ort LIKE 'Leipzig'
UNION ALL 
SELECT Feld1, Feld2, Feld3, 2 as Sort FROM user WHERE  plz LIKE '04%' 
ORDER BY sort, plz, userid
 
Danke für die schnelle Anwort.
Werd ich mal ausprobieren, mit der UNION ALL-Abfrage.
Was mir persönlich noch eingefallen ist, ist, ob es eine MySQL-Funktion gibt, mit der man einen Spaltenwert vergleichen kann und diesen Vergleich als Boolwer in einer anderen Spalte ausgeben kann.

Also in etwa so (Achtung: Schlechtes SQL):
SELECT ort, (boolfunktion zum Ort mit "0" als "nicht der Ort" und "1" als "jawoll, das isser"), plz FROM user WHERE ort LIKE 'Leipzig" OR plz LIKE '04%' ORDER BY bool DESC, userid, plz

Dann würden ja erst alle Zeilen, in der der Wert "1" also "ist Leipzig" steht, angezeigt und dann die mit "0", also "nee, ist nicht Leipzig.

Schonmal sorry, für das "blöde" SQL oben ;-)
 
Hallo Acer82,

Vergleiche kanst du mit CASE WHEN machen

Code:
Syntax CASE:
 CASE input_expression 
    WHEN when_expression THEN  result_expression 
        [ ...n ] 
    [ 
        ELSE  else_result_expression 
    ]
END
 
Zurück