我有一个表,其中列包含各种文件的许多URL,我想创建一个像结构,文件夹和文件之类的目录。
首先是文件夹,然后是文件
links
----------
http://abcd.com/efgh/hhg.txt
http://abcd.com/efgh/abc/bsbs/hsgs.txt
http://abcd.com/lmn.txt
http://abcd.com/jhksdh/khsdh/khd/abc.txt
http://abcd.com/dsfsdh/khsdh/dsfsdf/bsbs.txt
在查询中输入http://abcd.com/
时,它应该产生
╔════╦═════════════════╗
║ ║ ║
╠════╬═════════════════╣
║ 1 ║ efgh ║
║ 2 ║ jhksdh ║
║ 3 ║ dsfsdh ║
║ 4 ║ lmn.txt ║
╚════╩═════════════════╝
在查询中输入http://abcd.com/efgh/
时,它应该产生
╔════╦═════════════════╗
║ ║ ║
╠════╬═════════════════╣
║ 1 ║ abc ║
║ 2 ║ hhg.txt ║
╚════╩═════════════════╝
我无法使用 SUBSTRING_INDEX() 字符串函数编造查询
这是否足够接近您想要的?
select l.*
from links l
where l.link like concat(@link, '/%')
我问,因为通常这样的表经常(正确?)将所有级别作为单独的行。 因此,links
将有以下行:
http://abcd.com/efgh/abc/bsbs/hsgs.txt
http://abcd.com/efgh/abc/bsbs
http://abcd.com/efgh/abc
http://abcd.com/efgh
http://abcd.com
http://
然后,以下查询执行所需的操作:
select l.*
from links l
where l.link like concat(@link, '/%') and
l.link not like concat(@link, '/%/%');
在不更改数据的情况下,这通常可以工作:
select concat(@link, '/',
substring_index(substring(@link, length(@link) + 1
),
'/', 1
)
)
from links l
where l.link like concat(@link, '/%');
试试这个
set @param = 'http://abcd.com/efgh/';
select
distinct SUBSTRING_INDEX(REPLACE(link, @param, ''), '/', 1) as link
from links
where POSITION(@param IN link) > 0;