在mysql中连接任意数量的字符串行(分层查询)

时间:2008-10-08 20:11:17

标签: mysql string tree directory concat

我有一张带专辑的mysql表。每张专辑可以是顶级专辑,也可以是其他专辑的儿童专辑。每张专辑都有一个foldername,它是其图片所在文件夹的名称。每张专辑还有一个名为parent的字段,即父母专辑的id。所以,如果我有这样一个图像的路径:

root/album1/album2/image1.jpg

然后数据库中的专辑表将如下所示:

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

那么问题是,我如何只用mysql从这个表中获得前面打印的路径?

4 个答案:

答案 0 :(得分:7)

我不确定在数据库中存储树是个好主意......

为了简化您的问题,可能只需将相册的完整路径存储在表格的一列中......

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

答案 1 :(得分:2)

本文介绍了执行此操作的方法:linky

答案 2 :(得分: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

至少应该让您了解如何获取路径名称。您从未指定存储文件名的位置。

顺便说一下,这会很慢。我讨厌使用游标......

答案 3 :(得分:0)

DB2,SQL Server,PostgreSQL和Oracle都支持公用表表达式(CTE),可用于实现此目的。 Oracle还有“CONNECT BY”关键字。

我知道这不能解决您的问题,但也许它可以帮助其他人寻找MySQL以外的解决方案。

在您的情况下,出于性能考虑,我建议将完整路径存储在一列中 - 对插入/更新的非规范化数据的管理可能会在读取时的性能上多次收回。