2009-10-19 21 views
34

Mam około 20 000 wierszy w tabeli INNODB o nazwie "karty", więc FULLTEXT nie jest opcją.MySQL - Jak zamówić według odmiany? Tabela INNODB

Proszę rozważyć tę tabelę:

id  |  name  |  description 
---------------------------------------------------------- 
1  John Smith  Just some dude 
2  Ted Johnson  Another dude 
3  Johnathan Todd This guy too 
4  Susan Smith  Her too 
5  Sam John Bond And him 
6  John Smith  Same guy as num 1, another record 
7  John Adams  Last guy, promise 

więc powiedzieć użytkownik szuka „John”, chcę zestaw wyników się w kolejności:

7  John Adams 
6  John Smith 
3  Johnathan Todd 
5  Sam John Bond 
2  Ted Johnson 

Należy pamiętać, że "Pociągnąłem tylko" Johna Smitha ", wzięliśmy jego najnowszy wpis. Ze względu na moje dane, wszystkie imiona są dla tej samej osoby, nie trzeba się martwić o dwóch różnych facetów o imieniu John Smith. Pomysły? Daj mi znać, jeśli mogę coś wyjaśnić.

+1

Wydaje się chce zamówić przez "Nazwisko, imię", a nie według trafności (jednak zdefiniowanie tego). Czy to jest poprawne? – Tomalak

Odpowiedz

110

wersja 1:

SELECT max(id) id, name 
    FROM cards 
WHERE name like '%John%' 
GROUP BY name 
ORDER BY CASE WHEN name like 'John %' THEN 0 
       WHEN name like 'John%' THEN 1 
       WHEN name like '% John%' THEN 2 
       ELSE 3 
      END, name 

wersja 2:

SELECT max(id) id, name 
    FROM cards 
WHERE name like '%John%' 
GROUP BY name 
ORDER BY CASE WHEN name like 'John%' THEN 0 
       WHEN name like '% %John% %' THEN 1 
       WHEN name like '%John' THEN 2 
       ELSE 3 
      END, name 
+0

Awesome! Działa to dokładnie tak, jak tego chciałem. Dzięki najmeddine! – k00k

+1

cieszymy się z pomocy. Zmodyfikowałem go trochę, aby obsłużyć więcej przypadków. – manji

+0

Myślę, że w inny sposób działa lepiej w moim konkretnym przypadku, ale oba mogą być pomocne dla innych, czy możesz umieścić tam oba dla dobra potomności? – k00k