2010-03-02 19 views
9

Mam następujący test ciąg engine/mail/key i tabeli, która wygląda następująco:Znajdź najlepszy wiersz pasujący w MySQL (InnoDB)

+-------------+ 
| query  | 
+-------------+ 
| engine  | 
| engine/pdf | 
| engine/mail | 
+-------------+ 

chcę, aby znaleźć najlepsze dopasowanie wiersz. Najlepsze dopasowanie jest określane przez najbardziej pasujące znaki od początku ciągu/wiersza.

Skonstruowałem RegExp, ale oczywiście pasuje do wszystkich wierszy i nie dostarczy mi żadnych informacji o tym, który pasuje do większości znaków/części.
Regexp: ^engine(/mail(/key)?)?

miałem inne wyobrażenie na temat korzystania FIND_IN_SET funkcji MySQL tak:

`FIND_IN_SET(query,'engine,engine/mail,engine/mail/key')` 

i porządku wynik przez to wyjście.

To by działało, ale nie jest to w żaden sposób miłe rozwiązanie. Czy ktokolwiek ma lepszy pomysł na ten temat?

Odpowiedz

9

Po prostu użyj LIKE, ale na odwrót do tego, do czego prawdopodobnie przywykłeś.

select query 
from table1 
where 'engine/mail/key' like concat(query,'%') 
order by length(query) desc 
limit 1 

Wyniki:

mysql> select * from query; 
+-------------+ 
| query  | 
+-------------+ 
| engine  | 
| engine/pdf | 
| engine/mail | 
+-------------+ 
3 rows in set (0.00 sec) 

mysql> select query from query 
     where 'engine/mail/key' like concat(query,'%') 
     order by length(query) desc 
     limit 1; 
+-------------+ 
| query  | 
+-------------+ 
| engine/mail | 
+-------------+ 
1 row in set (0.01 sec) 
+1

To niczego nie pasuje. Również porządkowanie według 'LENGTH (zapytanie)' nie jest wystarczające, ponieważ może być wiersz taki jak "engine/website", który zostałby następnie wybrany przez 'engine/mail'. –

+0

Przepraszamy, poprawiono zapytanie, aby teraz działało. Wypróbuj teraz, aby sprawdzić, czy przynosi oczekiwane rezultaty. –

+0

Dzięki za to, znacznie lepiej niż hack 'FIND_IN_SET'! Używanie "LIKE" w inny sposób jak ten jest naprawdę fajną sztuczką! –

Powiązane problemy