我正在尝试根据乔·塞尔科(Joe Celko)的路径枚举模型 (第38页)。我的表的相关属性(以及仅包含顺序整数的支持表)看起来像:

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

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

_integereries包含整数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);

...成功地返回一个包含层次结构中所有贡献ID 3上级的结果集。现在,在此示例中,路径列保持了普通的整数值,显然,一旦达到贡献ID 10。

1   1.
2   1.2.
3   1.2.3.

现在...这本书没有给出当路径使用定界符时获得上司的示例...因此,我将不得不稍后弄清楚。但这确实给出了一个示例,说明了如何拆分路径串(我猜这将帮助我进行卓越的搜索)。示例代码的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 || '.');

...但是此代码返回一个空结果集。我做错了什么,但我不确定。在用电子邮件打扰乔之前,我想到了我将其放到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 是布尔人 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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top