我正在编写一个PHP路由器,它使用这样的查询在数据库中查找页面的id
SELECT `id` FROM `pages` WHERE '/about/test' REGEXP `url` ORDER BY `url`
来自这样的表
id type_id url name lookup
1 0 /about/[^/]* NULL NULL
2 1 /about/company NULL NULL
所以它在2
上获得了'/about/company'
,在第一行结果上的1
上获得了/about/whatever
我正在寻找从MySQL检索通配符值的最佳方法,例如通过'/about/[^/]+'
时获取'test'
条目的ID和'/about/test'
作为第二个参数;并且在通过'/about/company'
简单地说,我希望获得可变数量的列,其中第一列返回ID而其他列 - 正确顺序的通配符值
答案 0 :(得分:0)
让我假设您有一个标志,指定某些内容是通配符模式还是简单比较。
如果你想要所有比赛,你可以这样做:
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;