MySQL - jak zamawiać według trafności? Stół INNODB

Mam około 20 000 wierszy w tabeli INNODB zwanej 'kartami' , więc pełny tekst nie wchodzi w grę.

Proszę wziąć pod uwagę 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 powiedzmy, że użytkownik wyszukuje 'John', chcę, aby wynik ustawiony był w kolejności:

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

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

Author: k00k, 2009-10-19

1 answers

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
 110
Author: manji,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-10-19 16:25:49