2008-12-13 9 views
1

Donc, j'ai les lignes suivantes dans le DB:PHP + MySQL: recherche en utilisant des caractères génériques

1 |/users/

2 |/users/admin/

3 |/users/admin/*

4 |/users/admin/mike/

5 |/users/admin/steve/docs/

L'URL d'entrée est /users/admin/steve/, et le but est de trouver la correspondance URL de la base de données.

Je veux renvoyer # 3 comme la ligne correcte, puisque le caractère générique "*" spécifie que tout peut aller à la place de l'astérisque. Quelle serait la méthode la plus efficace pour cela?

Voilà mes premières impressions, mais je suis sûr qu'ils pourraient être améliorés:

  1. Faire une requête pour voir s'il y a une correspondance URL exacte
  2. Si aucune correspondance, puis récupérer toutes les lignes avec "*" comme dernier caractère, dans l'ordre inverse (donc les URL plus spécifiques ont la priorité)
  3. Pour chaque ligne, si elle (moins le "*") correspond à l'URL d'entrée, retournez-la
  4. Si rien est trouvé, alors nous sommes SOL

Répondre

2

Voilà comment je le ferais:

SELECT * FROM mytable AS m 
WHERE <input-url> = m.urlpattern 
OR <input-url> REGEXP REPLACE(m.urlpattern, '*', '.*'); 

REPLACE() est de changer le caractère générique de style globbing en un équivalent générique d'expression régulière.

+0

C'est parfait, merci! – Matt

0

Si je comprends bien, quelque chose comme cela devrait fonctionner:

SELECT COALESCE (

(SELECT quel que soit de votre requête pour voir s'il y a une url exacte),
(SELECT approximation suivante),
'SOL'

)

Questions connexes