質問

Joe Celkoのようにパス列挙モデルを実装しようとしています (38ページ)。私のテーブルの関連属性(およびシーケンシャル整数を含むサポートテーブル)は次のようになります。

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

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

_Integerseriesには、整数1からnが含まれています。ここで、nは必要以上に大きくなります。貢献には3つのレコードが含まれています。

1  1
2  12
3  123

...そして、私はジョーのクエリの変更されたバージョンを使用します:

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);

...階層内のすべてのCombutionID 3の上司を含む結果セットを正常に返すこと。この例では、PathString列には整数値が単純な値を保持しており、CompriventID 10に達したら明らかにトラブルに遭遇します。

1   1.
2   1.2.
3   1.2.3.

さて...この本は、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 || '.');

...しかし、このコードは空の結果セットを返します。私は何か間違ったことをしていますが、何がわかりません。メールでジョーを悩ませる前に、これを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