10 votes

Trouver la meilleure ligne correspondante dans MySQL (InnoDB)

J'ai la chaîne de test suivante engine/mail/key et un tableau qui ressemble à ceci :

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

Je veux trouver la meilleure rangée correspondante. La meilleure correspondance est spécifiée par les caractères les plus correspondants à partir du début de la chaîne/rangée.

J'ai construit une RegExp, mais elle correspond bien sûr à toutes les lignes et ne me donne aucune information sur celle qui correspond au plus grand nombre de caractères/parties.
Regexp : ^engine(/mail(/key)?)?

J'ai eu une autre idée en utilisant la fonction MySQL FIND_IN_SET comme ceci :

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

Et ordonner le résultat par son rendement.

Cela pourrait fonctionner, mais ce n'est en aucun cas une solution agréable. Quelqu'un a-t-il une meilleure idée à ce sujet ?

10voto

a'r Points 14772

Utilisez simplement LIKE, mais dans le sens inverse de celui auquel vous êtes probablement habitué.

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

Résultats :

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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X