1

アルバムを含む mysql テーブルがあります。各アルバムは、トップ レベルのアルバムにすることも、別のアルバムの子アルバムにすることもできます。各アルバムには、その写真が入っているフォルダーの名前であるフォルダー名があります。各アルバムには、親アルバムの ID である親と呼ばれるフィールドもあります。したがって、次のような画像へのパスがある場合:

root/album1/album2/image1.jpg

データベースのアルバム テーブルは次のようになります。

id parent foldername
1  NULL   root
2  1      album1
3  2      album2

問題は、mysql のみを使用して、このテーブルから以前に出力されたパスを取得するにはどうすればよいかということです。

4

3 に答える 3

7

ツリーをデータベースに保存するのが良い考えかどうかはわかりません...

問題を単純に保つために、アルバムのフルパスをテーブルの列に保存するだけです...

id parent path           foldername
1  NULL   /              root
2  1      /root/         album1
3  2      /root/album1/  album2
于 2008-10-08T23:16:34.310 に答える
0

DB2、SQL Server、PostgreSQL、およびOracleはすべて、これを実現するために使用できるCommon Table Expressions(CTE)をサポートしています。Oracleには「CONNECTBY」キーワードもあります。

私はそれがあなたの問題を解決しないことを知っています、しかし多分それはMySQL以外の何かで解決策を探している誰かを助けるでしょう。

あなたの場合、パフォーマンスのために、フルパスを列に格納することをお勧めします。挿入/更新時の非正規化データの管理は、読み取り時のパフォーマンスで何度も利益を得る可能性があります。

于 2009-08-29T07:42:54.253 に答える
0

完全にテストされておらず、頭のてっぺんからタイプされています...

DECLARE @FOLDER VARCHAR(200)
DECLARE @TOPID AS INT
DECLARE @MYID As int

CREATE TABLE #tmp
(
    [id] INT,
    [path] VARCHAR(50)
)

DECLARE tempCursor CURSOR FOR SELECT id FROM albums ORDER BY id
OPEN tempCursor

FETCH NEXT FROM tempCursor INTO @TOPID

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @FOLDER = ''
    SET @MYID = @TOPID

    WHILE @MYID is not null
    BEGIN
        SELECT @MYFOLDER = foldername FROM albums WHERE id = @MYID
        SET @FOLDER = @MYFOLDER + '/' + @FOLDER
        SELECT @MYID = parent FROM albums WHERE id = @MYID
    END

    INSERT INTO #tmp
    SELECT @TOPID, @FOLDER

    FETCH NEXT FROM tempCursor INTO @TOPID
END
CLOSE tempCursor
DEALLOCATE tempCursor

SELECT * FROM #tmp
DROP TABLE #tmp

これで、少なくともパス名を取得する方法がわかります。ファイル名が保存されている場所を指定したことはありません。

ところで、これは遅くなるでしょう。カーソルを使うのは嫌いです...

于 2008-10-08T22:56:30.823 に答える