2010-03-02 17 views
9

ho la seguente stringa di prova engine/mail/key e un tavolo che assomiglia a questo:Trova miglior riga corrispondente in MySQL (InnoDB)

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

voglio trovare il miglior riga corrispondente. La corrispondenza migliore viene specificata dai caratteri più corrispondenti dall'inizio della stringa/riga.

Ho creato un RegExp, ma ovviamente corrisponde a tutte le righe e non mi fornisce alcuna informazione su quale sia il maggior numero di caratteri/parti.
Regexp: ^engine(/mail(/key)?)?

ho avuto un altra idea su come utilizzare la funzione di MySQL FIND_IN_SET come questo:

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

e l'ordine il risultato per il suo output.

Ciò funzionerebbe, ma non è in alcun modo una buona soluzione. Qualcuno ha un'idea migliore di questo?

risposta

9

Basta usare LIKE, ma il contrario a ciò che probabilmente siete abituati.

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

Risultati:

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

Questo non corrisponde nulla. Anche ordinare con 'LENGTH (query)' non è sufficiente, dato che potrebbe esserci una riga come 'engine/website' che verrebbe quindi scelta su' engine/mail'. –

+0

Siamo spiacenti, ho corretto la query in modo che venga ora eseguita. Provalo ora per vedere se ti sta dando i risultati che ti aspetti. –

+0

Grazie per questo, molto meglio di "FIND_IN_SET' hack! Usare 'LIKE' in un altro modo come questo è davvero un trucco perfetto! –

Problemi correlati