我正在写一个PHP路由器,它在数据库中查找页面的id与这样的查询
SELECT `id` FROM `pages` WHERE '/about/test' REGEXP `url` ORDER BY `url`
from such table
id type_id url name lookup
1 0 /about/[^/]* NULL NULL
2 1 /about/company NULL NULL
所以在结果
的第一行,它得到'/about/company'
上的id 2
和/about/whatever
上的id 1
我正在寻找从MySQL检索通配符值的最佳方法,例如,当传递'/about/test'
时,获取'/about/[^/]+'
条目和'test'
作为第二个参数的ID;通过'/about/company'
时只获取ID
简单地说,我想获得可变的列数,其中第一列返回ID和其他通配符值在正确的顺序
让我假设您有一个标志,用于指定某些内容是通配符模式还是简单的比较。
如果你想要所有的匹配,你可以这样做:
SELECT `id`
FROM `pages`
WHERE '/about/test' REGEXP `url` AND url_has_wildcard = 0
UNION ALL
SELECT `id`
FROM `pages`
WHERE '/about/test' REGEXP `url` AND url_has_wildcard = 1 AND
NOT EXISTS (SELECT 1
FROM pages
WHERE '/about/test' REGEXP `url` AND url_has_wildcard = 0
);
可以使用正则表达式定义这样一个标志。比如,像这样:
WHERE '/about/test' REGEXP `url` AND
(url REGEXP '^[a-zA-Z0-9/]*$') -- or whatever the valid characters are
如果您只想返回一行,您可以这样做:
SELECT `id`
FROM `pages`
WHERE '/about/test' REGEXP `url`
ORDER BY (url REGEXP '^[a-zA-Z0-9/]*$') DESC
LIMIT 1;