当前位置: 首页 > 面试题库 >

在mysql中基于路径选择

花欣然
2023-03-14
问题内容

我有一个column id,一列parent和作为实例path化路径的一列。

看起来像

1  | \N | 1  
2  | 1  | 1/2  
3  | 2  | 1/2/3  
4  | 3  | 1/2/3/4  
5  | 3  | 1/2/3/5  
6  | 2  | 1/2/6  
7  | 6  | 1/2/6/7  
8  | 2  | 1/2/8  
9  | 1  | 1/9  
10 | 9  | 1/9/10  
11 | 10 | 1/9/10/11  
12 | 11 | 1/9/10/11/12  
13 | 11 | 1/9/10/11/13  
14 | 11 | 1/9/10/11/14  
15 | 14 | 1/9/10/11/14/15  
16 | 14 | 1/9/10/11/14/16  
17 | 14 | 1/9/10/11/14/17  
18 | 10 | 1/9/10/18  
19 | \N | 19  
20 | 19 | 19\20  
21 | 19 | 19\21

我需要根据此表进行一些查询。

我需要做的查询是

选择所有id9个孩子

SELECT * FROM `tester` WHERE 'path' LIKE '%/9/%';

可以正常工作,直到您将ID替换为1或19,因为/开头没有ID 。

SELECT * FROM `tester` WHERE 'path' LIKE '%1/%';

将选择数字以1结尾的所有行,因此1、11、21、31、211等

SELECT * FROM `tester` WHERE 'path' LIKE '1/%';

将在第1行或第19行中正常工作

所以SELECT * FROM测试员WHERE 'path' LIKE '1/%' OR 'path' LIKE '%/1/%';
我能提出最好的建议吗?

选择9,但没有子儿的直接孩子
对于这个Select * from测试仪where 'parent' = 9; 会很好的工作。

选择9个孩子的总数,x个深度。

所以我想以一行level1, level2, level3, ... levelx或x行结尾,分别代表不同的级别,

让我们假设本例中的x是3,本例中的行将是9, 8, 6(如果我们要求的话,第4级将是3)

有任何想法吗?

编辑

#select count of children of specific node(5) down to a maximum of three levels, do no include the parent
SELECT COUNT(child.id) children, 
LENGTH(REPLACE(child.path, parent.path, '')) - LENGTH(REPLACE(REPLACE(child.path, parent.path, ''), '/', '')) AS LEVEL
FROM `tester` child JOIN `tester` parent ON child.path LIKE CONCAT(parent.path,'%') 
WHERE parent.id  =5 
GROUP BY LEVEL HAVING LEVEL <= 3 AND LEVEL > 0;

**选择9的孩子的ID降到x个级别,相对于9个级别

因此,在此示例中,我们再次将3用作x。

我们正在寻找回来

10 | 1
11 | 2
18 | 2
12 | 3
13 | 3
14 | 3

再次我完全不知道该怎么做。

编辑:

#select all information, and relative level from parent of children of specific node(5) down to a maximum of three levels, do no include the parent
SELECT child.*, 
LENGTH(REPLACE(child.path, parent.path, '')) - LENGTH(REPLACE(REPLACE(child.path, parent.path, ''), '/', '')) AS LEVEL
FROM `tester` child JOIN `tester` parent ON child.path LIKE CONCAT(parent.path,'%') 
WHERE parent.id  =9 
GROUP BY id HAVING LEVEL <= 3 AND LEVEL > 0;

问题答案:

请注意,这些解决方案基于字符串比较,未经过优化且不能使用索引。您应该考虑以其他方式标准化表格。(请参阅在MySQL中管理分层数据

关于一些问题:

选择所有ID为9的孩子:

由于该Path列不包含前斜杠和后斜杠,因此您需要将它们连接到路径:

SELECT * 
FROM tester
WHERE CONCAT('/', path, '/') LIKE '%/9/%';

选择总数为9的孩子,深度为x级:

我们需要按路径中的斜杠数量减去父路径中的斜杠数量进行分组:

SELECT (LENGTH(c.Path) - LENGTH(REPLACE(c.Path, '/', '')))
    - (LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', ''))) AS Level,
    COUNT(*)
FROM tester c
    JOIN tester p ON c.Parent = p.ID
WHERE CONCAT('/', path, '/') LIKE '%/9/%';
GROUP BY 1

为简单起见,我使用上面的查询来显示所有级别,如果要限制x个级别的深度,请使用WHERE下面查询中的谓词。

选择9的孩子的ID降到x级别,相对于9的级别:

我们在搜索该Path列时会考虑到父级,但最多可以搜索到一个级别的轴数:

SELECT c.*
FROM tester c
    JOIN tester p ON c.Parent = p.ID
WHERE CONCAT(
    '/',
    SUBSTRING_INDEX(
        Path, 
        '/', 
        (LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', ''))) + 4
    ),
'/') LIKE '%/9/%'

我们正在采取的步骤:

  1. 我们需要找出父级有多深,我们可以通过计算父级路径中的斜线来发现这一点。(LENGTH(p.Path) - LENGTH(REPLACE(p.Path, '/', ''))
  2. 我们需要在该数字上加1,因为斜线为1的路径深2级。
  3. 我们将所需数量的x数量相加。
  4. 抓取路径列直至总计级别(使用SUBSTRING_INDEX功能)。
  5. 添加前导斜杠和尾部斜杠。
  6. 在最后的字符串中搜索9。


 类似资料:
  • 我的目标是开发一个单一的骆驼路线来映射这些服务器,接受路径中服务器的名称。类似于这样: 我的(简化且不起作用)Blueprint.xml: 问题是,我不知道如何从路径中移除/center、/north或/south,因此头部被传递给目标服务,而目标服务不知道如何处理它。调用:

  • 基于路径的授权 Apache和svnserve都可以给用户赋予(或拒绝)访问许可,通常是对整个版本库:一个用户可以读版本库(或不),而且他可以写版本库(或不)。如果可能,也可以定义细粒度的访问规则。一组用户可以有版本库的一个目录的读写权限,但是没有其它的;另一个目录可以是只对一少部分用户可读。 两种服务器都使用同样的文件格式描述路径为基础的规则,如果是Apache,需要加载mod_authz_sv

  • 问题内容: 我正在尝试在正在制作的购物车中显示图像,但没有显示出来。我必须导入每个图像吗?我知道我的路径很好,因为它以前可以工作。我认为我的product.js文件中可能有问题,但我无法弄清楚。 这是我的Product.js 数据来自此product.js 我正在提取所有数据,但图像没有显示 问题答案: 假设您使用的是webpack,则需要导入图像以使其像 现在您的图像数据是动态的,直接指定导入路

  • 我有一个String,它是页面的路径,例如。我正在收集此页面的XML并将其保存到DAM,但我想将其保存在下的类似树结构中。 我尝试了以下代码 但它给出了以下错误 找不到{http://www.jcp.org/jcr/1.0}内容的匹配子节点定义 因为存储库中没有这样的路径。有没有一种方法可以让我即时创建一个目录。因为要保存这个文件,我需要在下创建整个树,然后保存在该目录中。 请建议。

  • 参见文档“10. Web”部分

  • 问题内容: 我有一张叫的桌子。在该表中,我有以下栏目:,,, 我有另一个表,唯一重要的列是,我想将其与表行进行比较。 该表如下所示: 假设我有一个表(user_meta)像这样: 我想为每个检索单个行,但前提是公司ID和user_type正确。 我想检索在查询中发送的具有相同companyID的所有用户,因此,假设$ companyID = 2,然后所有具有=’staff’的用户。 因此,user