gpt4 book ai didi

sql - 在 MySQL 中拆分路径枚举模型 PathString

转载 作者:行者123 更新时间:2023-11-29 02:36:19 25 4
gpt4 key购买 nike

我正在尝试根据 Joe Celko 的 book 实现路径枚举模型(第 38 页)。我的表(以及仅包含连续整数的支持表)的相关属性如下所示:

Contribution
------------
ContributionID
PathString

_IntegerSeries
--------------
IntegerID

_IntegerSeries 包含从 1 到 n 的整数,其中 n 比我需要的要大。贡献包含三个记录:

1  1
2 12
3 123

... 我使用了 Joe 查询的修改版本:

SELECT SUBSTRING( c1.PathString
FROM (s1.IntegerID * CHAR_LENGTH(c1.ContributionID))
FOR CHAR_LENGTH(c1.ContributionID)) AS ContID
FROM
Contribution c1, _IntegerSeries s1
WHERE
c1.ContributionID = 3
AND s1.IntegerID <= CHAR_LENGTH(c1.PathString)/CHAR_LENGTH(c1.ContributionID);

... 成功返回包含层次结构中 ContributionID 3 的所有上级的结果集。现在,在此示例中,PathString 列包含纯整数值,显然一旦我们达到 ContributionID 10,我们就会遇到麻烦。因此我们修改 PathString 列以包含分隔符:

1   1.
2 1.2.
3 1.2.3.

现在...这本书没有给出在 PathString 使用定界符时获得上级的示例...所以我必须稍后再弄清楚。但它确实给出了如何拆分 PathString 的示例(我猜这将帮助我进行更高级的搜索)。执行此操作的示例代码的 MySQL 版本是:

SELECT SUBSTRING( '.' || c1.PathString || '.'
FROM s1.IntegerID + 1
FOR LOCATE('.', '.' || c1.PathString || '.', s1.IntegerID + 1) - s1.IntegerID - 1) AS Node
FROM _IntegerSeries s1, Contribution c1
WHERE
SUBSTRING('.' || c1.PathString || '.' FROM s1.IntegerID FOR 1) = '.'
AND IntegerID < CHAR_LENGTH('.' || c1.PathString || '.');

... 但是此代码返回一个空结果集。我做错了什么,但我不确定是什么。我想在用电子邮件打扰 Joe 之前,我会把它发布到 stackoverflow 社区。有人有什么想法吗?


更新


Quassnoi 的查询...经过测试略有修改,但在功能上与他的原始查询完全相同。很不错。比我用的干净多了。非常感谢。

SET @contributionID = 3;

SELECT ca.*
FROM
Contribution c INNER JOIN _IntegerSeries s
ON s.IntegerID < @contributionID AND SUBSTRING_INDEX(c.PathString, '.', s.IntegerID) <> SUBSTRING_INDEX(c.PathString, '.', s.IntegerID + 1)
INNER JOIN Contribution ca
ON ca.PathString = CONCAT(SUBSTRING_INDEX(c.PathString, '.', s.IntegerID), '.')
WHERE c.ContributionID = @contributionID;

最佳答案

这是因为 MySQL 中的 || 是 bool 值 OR,而不是字符串连接。

要查找给定 Contribution 的所有祖先,请使用:

SELECT  ca.*
FROM Contribution с
JOIN IntegerSeries s
ON IntegerID < CHAR_LENGTH(c.path)
AND SUBSTRING_INDEX(c.path, '.', IntegerID) <> SUBSTRING_INDEX(c.path, '.', IntegerID + 1)
JOIN Contribution ca
ON ca.path = CONCAT(SUBSTRING_INDEX(c.path, '.', IntegerID), '.')
WHERE c.ContributionID = 3

关于sql - 在 MySQL 中拆分路径枚举模型 PathString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4566557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com