2008-12-13 202 views
1

所以,我在DB中有以下几行:PHP + MySQL:使用通配符搜索

1 |/users/

2 |/users/admin/

3 |/users/admin/*

4 |/users/admin/mike/

5 |/users/admin/steve/docs/

输入URL是/users/admin/steve/,目标是从数据库中找到URL匹配。

我想返回#3作为正确的行,因为通配符“*”指定任何东西都可以代替星号。这样做最有效的方法是什么?

这是我最初的想法,但我敢肯定,他们可以改进:

  1. 进行查询,看看是否有一个确切的URL匹配
  2. 如果没有匹配,然后检索所有行以“*”作为最后一个字符,倒序排列(因此更具体的URL优先)
  3. 对于每一行,如果它(输入“*”)与输入的URL匹配,则返回
  4. 如果没有任何结果找到了,那我们就是SOL

回答

2

以下是我会做:

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

的REPLACE()是改变文件名匹配式通配符成等价的正则表达式通配符。

+0

这很完美,谢谢! – Matt 2008-12-13 04:35:28

0

如果我理解这个正确的,这样的事情应该工作:

SELECT COALESCE(

(SELECT无论从查询,看看是否有一个确切的网址),
(选择下一个近似值),
'SOL'