Конкатенация произвольного числа строк строк в MySQL (иерархический запрос) - PullRequest
1 голос
/ 09 октября 2008

У меня есть таблица mysql с альбомами. Каждый альбом может быть альбомом верхнего уровня или дочерним альбомом другого альбома. У каждого альбома есть имя Folderame, которое является именем папки, в которой находятся его изображения. Каждый альбом также имеет поле с именем parent, которое является идентификатором родительского альбома. Итак, если у меня есть путь к изображению, как это:

root/album1/album2/image1.jpg

тогда таблица альбомов в базе данных будет выглядеть так:

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

Тогда возникает вопрос, как мне получить путь, напечатанный ранее из этой таблицы, только с помощью mysql?

Ответы [ 4 ]

7 голосов
/ 09 октября 2008

Я не уверен, что хранить дерево в базе данных - хорошая идея ...

Для простоты вашей проблемы, возможно, просто сохраните полный путь к альбому в столбце таблицы ...

id parent path           foldername
1  NULL   /              root
2  1      /root/         album1
3  2      /root/album1/  album2
2 голосов
/ 09 октября 2008

Эта статья объясняет способ сделать это: linky

0 голосов
/ 29 августа 2009

DB2, SQL Server, PostgreSQL и Oracle поддерживают выражения общих таблиц (CTE), которые можно использовать для достижения этой цели. Oracle также имеет ключевое слово «CONNECT BY».

Я знаю, что это не решит вашу проблему, но, возможно, это поможет кому-то другому искать решение на чем-то ином, чем MySQL.

В вашем случае, для повышения производительности, я рекомендую хранить полный путь в столбце - управление денормализованными данными при вставке / обновлении, вероятно, многократно окупится при чтении.

0 голосов
/ 09 октября 2008

Абсолютно непроверенный и напечатанный на макушке моей головы ...

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

Это должно, по крайней мере, дать вам представление о том, как получить ваши пути. Вы никогда не указывали, где хранятся ваши имена файлов.

Кстати, это будет медленно. Я ненавижу использовать курсоры ...

...