Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Ori I
Člen
Avatar
Ori I:17.4.2014 12:26

Zdravim, uz dlhsiu dobu uvazujem ako by som vyriesil tento problem

mam tabulku s komentarmi
stlpce:
id | parent_id | user_id | text

Problemom je, ze chcem SQL prikaz, ktory vyberie kazdemu "rodicovi" jecho "potomkov". Ide vsak o to, ze vyriesit jednu uroven nestaci moze byt tych urovni viacej.

Snad sa chapeme.

Este by som podotkol, ze sa jedna o MySQL server a prechod na inu platformu nieje mozny

 
Odpovědět
17.4.2014 12:26
Avatar
Odpovídá na Ori I
Michal Štěpánek:18.4.2014 21:01

Můžeš zkusit "poddotazy", nebo použít JOIN na spojování tabulek. Konkrétněji ti ale těžko někdo poradí, když jsi neuvedl strukturu těch ostatních tabulek...

Nahoru Odpovědět
18.4.2014 21:01
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Odpovídá na Ori I
Nikola Sterziková (PaNika):29.4.2014 15:54

No, já bych ti mohla poradit řešení pro Microsoft SQL Server a ty by sis to mohl upravit na MySQL. (já jejich syntaxi neznám, tedy sql je stejné, ale je třeba použít kurzor a nějaký while cyklus...)

Tak tedy pro SQL server by to bylo třeba:

DECLARE @ParentID int
CREATE TABLE #Temp(parent_id int, potomek_id int)
-- Procházíme cyklem pro každý kořenový příspěvek
DECLARE Prispevky CURSOR FAST_FORWARD FOR
        SELECT id
                FROM dbo.Test
                where parent_id is null

        OPEN Prispevky
                FETCH NEXT FROM Prispevky
                        INTO @ParentID
                WHILE @@FETCH_STATUS = 0
                BEGIN

                        DECLARE @pocet int
                        SET @pocet = 0

                        INSERT INTO #Temp (parent_id, potomek_id)
                        SELECT  @ParentID, id
                                FROM dbo.Test
                                WHERE parent_id = @ParentID

                        WHILE @pocet != (SELECT COUNT(*) FROM #Temp)
                                BEGIN
                                        SET @pocet = (SELECT COUNT(*) FROM #Temp)

                                        INSERT INTO #Temp (parent_id, potomek_id)
                                                SELECT T1.parent_id, T1.id
                                                        FROM dbo.Test T1
                                                                INNER JOIN #Temp T
                                                                        ON T.parent_id  = T1.id
                                                                WHERE T1.parent_id is not null
                                                        EXCEPT
                                                                (SELECT * FROM #Temp T2)
                                END -- while @pocet


FETCH NEXT FROM Prispevky
                        INTO @ParentID
        END -- Kurzor Ustavy
CLOSE Prispevky
DEALLOCATE Prispevky

-- Nakonec ještě vložíme samotné kořenové příspěvky
INSERT INTO #Temp (parent_id, potomek_id)
(SELECT id, NULL
                FROM dbo.Test
                where parent_id is null)

-- *** VÝSLEDEK ***
SELECT * FROM #Temp
DROP TABLE #Temp
 
Nahoru Odpovědět
29.4.2014 15:54
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.