Łączenie dowolnej liczby wierszy ciągów mysql (zapytanie hierarchicznej)

głosy
1

Mam tabeli MySQL z albumów. Każda płyta może być album najwyższego poziomu lub album dziecko z innego albumu. Każda płyta ma nazwa_folderu która to nazwa folderu jej zdjęcia są w. Każda płyta posiada także pole o nazwie rodzic, który jest identyfikatorem albumu macierzystego. Tak więc, jeśli mam ścieżkę do obrazu w taki sposób:

root/album1/album2/image1.jpg

Następnie tabela album w bazie danych będzie wyglądać następująco:

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

Pytanie brzmi więc, w jaki sposób mogę uzyskać ścieżkę wydrukowaną wcześniej z tej tabeli tylko z MySQL?

Utwórz 08/10/2008 o 21:11
źródło użytkownik
W innych językach...                            


4 odpowiedzi

głosy
7

Nie jestem pewien, przechowywania drzewo w Bazie jest dobrym pomysłem ...

Aby zachować swój problem prosty może po prostu zachować pełną ścieżkę albumu w kolumnie tabeli ...

id parent path           foldername
1  NULL   /              root
2  1      /root/         album1
3  2      /root/album1/  album2
Odpowiedział 09/10/2008 o 00:16
źródło użytkownik

głosy
2

Ten artykuł wyjaśnia sposób, aby to zrobić: linky

Odpowiedział 08/10/2008 o 21:43
źródło użytkownik

głosy
0

DB2, SQL Server, PostgreSQL, Oracle i wsparcie wszystkim Common Table Expressions (CTE), które mogą być wykorzystane do osiągnięcia tego celu. Oracle ma również „Połącz przez” słowo kluczowe.

Wiem, że to nie rozwiąże problemu, ale może to pomoże kogoś szuka rozwiązania na coś innego niż MySQL.

W przypadku, ze względu na wydajność, zalecam przechowywanie pełnej ścieżki w kolumnie - zarządzanie danymi dotyczącymi nieznormalizowaną wkładką / update będzie prawdopodobnie płacić się z powrotem wiele razy w wydajności na czyta.

Odpowiedział 29/08/2009 o 08:42
źródło użytkownik

głosy
0

Całkowicie niesprawdzone i wpisane poza czubek mojej głowy ...

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 IGNORE  INTO #tmp
    SELECT @TOPID, @FOLDER

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

SELECT * FROM #tmp
DROP TABLE #tmp

To powinno przynajmniej daje wyobrażenie jak zdobycie nazw ścieżek. Nigdy nie podano, gdzie były przechowywane twoje nazwy plików.

BTW, to będzie powolne. Nienawidzę za pomocą kursorów ...

Odpowiedział 08/10/2008 o 23:56
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more