Avatar
Ori
Člen
Avatar
Ori:

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
Michal Štěpánek:

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
Nikola Sterziková (PaNika):

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.