MySQL REGEXP只匹配给定目录的子目录

MySQL REGEXP只匹配给定目录的子目录,mysql,regex,Mysql,Regex,考虑数据库条目,其路径写为: Lost & Found\Folder2039937\ | Lost & Found\Folder2039909\Folder3012231 Lost & Found\Folder2039909\ | Lost & Found\Folder2039909\Folder3012111 增加视觉效果以澄清结构 这些都没有外键,所以很遗憾,这是我唯一要做的事情 现在,给定Lost&Found路径,我需要在MySQL

考虑数据库条目,其路径写为:

Lost & Found\Folder2039937\
   |   Lost & Found\Folder2039909\Folder3012231

Lost & Found\Folder2039909\
   |    Lost & Found\Folder2039909\Folder3012111
增加视觉效果以澄清结构

这些都没有外键,所以很遗憾,这是我唯一要做的事情

现在,给定Lost&Found路径,我需要在MySQL中查询path Lost&Found的任何直接子目录。因此,结果应该是:

Lost & Found\Folder2039937\
Lost & Found\Folder2039909\
但是没有

Lost & Found\Folder2039937\Folder3012231
Lost & Found\Folder2039909\Folder3012111
我不知道如何使用MySQL查询来实现这一点。我尝试的是编写REGEXP来获取这些条目,但我无法找到正确的表达式。我尝试过多种组合,但我对REGEXP完全陌生,从来没有使用REGEXP的要求


REGEXP是我唯一能做到这一点的方法吗?如果是,那么正确的答案是什么

使用正则表达式,类似于:

select *
from paths
where path regexp '^Lost & Found\\\\([^\\]+)\\\\?$'
;
注意重复的\\\\-需要有两个级别,因为\\用于在字符串级别和正则表达式级别转义


以下是MySQL的REGEXP的文档:

也许是一个有趣的替代方案:

select path
from (
    select
        path,
        substring_index(path, '\\', 1) as part1,
        substring_index(substring_index(path, '\\', 2), '\\', -1) as part2
    from paths
) t
where part1 = 'Lost & Found'
    and part2 <> ''
    and length(concat(part1, part2)) + 1 = length(trim(trailing '\\' from path))
;
你可以在斜线上分开,把碎片拼起来。它变得有点混乱,然后试图检查是否有两块。也许有更好的办法,但这是我能想到的第一件事。它取part1和part2的长度,为它们之间的斜杠加上1,并将其与删除尾部斜杠的整个路径的长度进行比较,使其成为可选的

我发现过去在处理分隔文本时,SUBSTRING_INDEX是非常有用的,MySQL当然也有很多其他字符串操作函数可供选择,它们往往会变得很长,因为很难保存任何中间段

您也可以通过以下方式执行此操作:

总的来说,我不确定哪一个更快。但是,like表达式可以利用索引,因为它不是以通配符开头的。因此,在某些情况下,它可能会更快。

从文件REGEXP'Lost&Found\\\\[^\]+\\\\[^\\]+\\\\\[^\\]+\\\\\\\?$或文件REGEXP'Lost&Found\\\\\[^\]+\\\\\?$的路径中选择*


这将得到一级文件和文件夹的结果

您是否尝试过REGEXP'Lost&Found\\\\[^\\\]+\\\\\\?$'?@Siguza非常感谢,这正是我需要的。作为回答,我会接受。这对我的朋友不起作用。在我的数据库中生成空结果。这项技术很有趣,使字符串操作更接近我,但如果每个项目包含约460000行包含文件信息,并考虑到应用程序将有多个活动项目,在给定的时间在表中生成数百万条条目,此查询的运行速度比使用REGEXP慢3倍。虽然非常感谢您提出这个有趣的方法来处理分隔文本,但在我的情况下,它不会很好地工作。谢谢。你真是天才
where path like 'Lost & Found\\%' and
      path not like 'Lost & Found\\%\\%'