2010-08-31 19 views
20

davon aus, dass wir Suche mit Schlüsselwörtern durchführen: keyword1, keyword2, Begriff3Mysql: Sortieren nach like?

gibt es Aufzeichnungen in der Datenbank mit der Spalte "Name":

 
1: John Doe 
2: Samuel Doe 
3: John Smith 
4: Anna Smith 

jetzt Abfrage:

SELECT * FROM users WHERE (name LIKE "%John%" OR name LIKE "%Doe%") 

es wird Wählen Sie Datensätze: 1,2,3 (in dieser Reihenfolge) , aber ich möchte es nach Schlüsselwort in Beispiel keyword1=John, keyword2=Doe bestellen, so sollte es nach Stichwörtern aufgelistet werden: 1,3,2 (weil ich durchführen zu suchen für „Doe“ nach für „John“ gesucht)

Ich dachte über SELECT DISTINCT FROM (...... UNION .....) aber es wird viel einfacher, es zu bestellen irgendwie in einer anderen Art und Weise (real Abfrage wirklich lang)

Gibt es irgendwelche Tricks, um eine solche Reihenfolge zu erstellen?

Antwort

46
order by case 
    when name LIKE "%John%" then 1 
    when name LIKE "%Doe%" then 2 
    else 3 
end 
+0

ja, das funktioniert, danke :) – dfens

+0

eine Sache - wenn ich es richtig jeder LIKE verstehen wird 2 mal in ganzer Abfrage ausgeführt werden? – dfens

+0

@dfens: Ich vermute, dass das 'LIKE' in der' ORDER BY'-Klausel nur für die Daten ausgeführt wird, die mit der 'WHERE'-Klausel übereinstimmen, also sollte es schneller sein. – RedFilter

2
SELECT * 
from 
(
    SELECT u.*, 1 OrderNum 
    FROM users 
    WHERE (name LIKE "%John%") 
    UNION 
    SELECT u.*, 2 OrderNum 
    FROM users 
    WHERE (name LIKE "%Doe%") 
) 
    Order by OrderNum 
2

auf Rotfilter Antwort zu bauen, können Sie die Zeilen, die beide Schlüsselwörter an der Spitze sein machen könnte:

order by case 
when (name LIKE "%John%" and name LIKE "%Doe%") then 1 
when name LIKE "%John%" then 2 
when name LIKE "%Doe%" then 3 
end 
0

Mein Beispiel werden alle der John ‚s von der Doe gefolgt bestellen Alphabetisch ist es.

ORDER BY CASE 
    WHEN name LIKE "John%Doe" THEN CONCAT('a',name) 
    WHEN name LIKE "John%" THEN CONCAT('b',name) 
    WHEN name LIKE "%Doe"  THEN CONCAT('c',name) 
    ELSE name 
END