2010-08-31 16 views
20

Zakładamy, że wykonujemy wyszukiwania za pomocą słów kluczowych: keyword1, kluczowe2, słowo kluczowe3Mysql: Zamów przez jak?

istnieją rekordy w bazie danych z kolumny "name":

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

teraz zapytania:

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

to będzie wybierz zapisy: 1,2,3 (w tej kolejności) , ale chcę go zamówić przez słowo kluczowe w przykładzie keyword1=John, keyword2=Doe , dlatego powinien być wymieniony według słów kluczowych: 1,3,2 (ponieważ chcę wyszukać "Doe" po wyszukaniu "John")

Myślałem o SELECT DISTINCT FROM (...... UNION .....) , ale będzie o wiele łatwiej zamówić jakoś w inny sposób (prawdziwe zapytanie to naprawdę długo)

Czy są jakieś sztuczki, aby stworzyć takie zamówienie?

Odpowiedz

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

tak, to działa, dziękuję :) – dfens

+0

jeszcze jedno - jeśli dobrze rozumiem, każdy LIKE będzie wykonany 2 razy w całym zapytaniu? – dfens

+0

@dfens: Zgaduję, że "LIKE" w klauzuli "ORDER BY" będzie wykonywane tylko na danych, które zostały dopasowane przez klauzulę "WHERE", więc powinno być szybciej. – 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

Aby zbudować na odpowiedź RedFilter jest, można zrobić wiersze, które mają zarówno słowa kluczowe, aby być na szczycie:

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

Mój przykład będzie zamówić wszystkie „s John Alfabetycznie następnie przez Doe .

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