Pitäis saada muodostettua SQL-lause, joka hakee oheisen näköisestä hässäkästä tietueet järjestykseen niin, että aina kun on parentid -1, sen alle haetaan kaikki tasoid:t, joiden parentid on ko. -1 parent. Ja noita id:tä on muitakin kuin 37, joten where id=37 pitää unohtaa. Yleensä ne onkin järjestyksessä, mutta sitten välillä tulee muutama orpo tietue, joiden parentid kuuluu ylemmäs, kuin missä ne nyt on.
id tasoid parentid
37 1 -1
37 2 -1
37 3 -1
37 4 3
37 5 3
37 6 -1
37 7 6
37 8 6
37 9 6
37 10 6
37 11 6
37 12 -1
37 13 12
37 14 12
37 15 12
37 16 12
37 17 12
37 18 12
37 19 12
37 20 12
37 21 12
37 22 12
37 23 12
37 24 12
37 25 12
37 26 12
37 27 12
37 28 12
37 29 12
37 30 12
37 31 12
37 32 12
37 33 12
37 34 -1
37 35 34
37 36 34
37 37 34
37 38 34
37 39 34
37 40 34
37 41 34
37 42 34
37 43 34
37 44 34
37 45 34
37 46 34
37 47 34
37 57 -1
37 58 57
37 59 57
37 60 57
37 61 57
37 62 34
37 63 34
37 64 34
37 65 34
37 66 34
37 67 34
37 68 34
37 69 34
37 70 34
37 71 34
id tasoid parentid
37 1 -1
37 2 -1
37 3 -1
37 4 3
37 5 3
37 6 -1
37 7 6
37 8 6
37 9 6
37 10 6
37 11 6
37 12 -1
37 13 12
37 14 12
37 15 12
37 16 12
37 17 12
37 18 12
37 19 12
37 20 12
37 21 12
37 22 12
37 23 12
37 24 12
37 25 12
37 26 12
37 27 12
37 28 12
37 29 12
37 30 12
37 31 12
37 32 12
37 33 12
37 34 -1
37 35 34
37 36 34
37 37 34
37 38 34
37 39 34
37 40 34
37 41 34
37 42 34
37 43 34
37 44 34
37 45 34
37 46 34
37 47 34
37 57 -1
37 58 57
37 59 57
37 60 57
37 61 57
37 62 34
37 63 34
37 64 34
37 65 34
37 66 34
37 67 34
37 68 34
37 69 34
37 70 34
37 71 34
Vastaukset 3
Vanhimmat
En tiedä ymmärsinkö kysymyksesi oikein (oikean järjestyksen näyttäminen helpottaisi hieman asiaa), mutta tässä olisi muutama ehdotus.
1. select id, tasoid, parentid from taulu order by id, parentid, tasoid;
2. select id, tasoid, parentid from taulu order by parentid, tasoid, id;
Noita minäkin yritin aluksi tarjota, mutta kun id:n sisällä on monta eri parentid:tä, joissa arvo -1 eli päätaso, ja kaikkien näiden -1:n alle pitää tulla sellaiset rivit, joiden parentid on tuon -1 parentid:n tasoid. Sillä kerrotaan se kuuluminen siihen päätasoon. Eli
id tasoid parentid
37 1 -1
37 2 -1
37 3 -1
37 4 3
37 5 3
37 6 -1
37 7 6
37 8 6
37 9 6
37 12 -1
37 13 12
37 14 12
37 15 12
37 16 12
37 17 12
37 34 -1
37 35 34
37 36 34
37 37 34
37 38 34
37 39 34
37 40 34
37 41 34
37 42 34
37 43 34
37 44 34
37 45 34
37 46 34
37 47 34
37 57 -1
37 58 57
37 59 57
37 60 57
37 61 57
37 62 34
37 63 34
37 64 34
37 65 34
37 66 34
37 67 34
37 68 34
37 69 34
37 70 34
37 71 34
Pitäis olla sortin jälkeen
id tasoid parentid
37 1 -1
37 2 -1
37 3 -1
37 4 3
37 5 3
37 6 -1
37 7 6
37 8 6
37 9 6
37 12 -1
37 13 12
37 14 12
37 15 12
37 16 12
37 17 12
37 34 -1
37 35 34
37 36 34
37 37 34
37 38 34
37 39 34
37 40 34
37 41 34
37 42 34
37 43 34
37 44 34
37 45 34
37 46 34
37 47 34
37 62 34
37 63 34
37 64 34
37 65 34
37 66 34
37 67 34
37 68 34
37 69 34
37 70 34
37 71 34
37 57 -1
37 58 57
37 59 57
37 60 57
37 61 57
No entäpä tälläinen ehdotus.
select t1.id, t2.tasoid, t2.parentid from taulu as t1, taulu as t2 where (t1.id=t2.id and t1.parentid=-1) and ((t1.tasoid=t2.parentid) or (t1.tasoid=t2.tasoid and t2.parentid=-1)) order by t1.id, t1.tasoid, t2.parentid, t2.tasoid;
Eli vasemman puoleisesta taulusta t1 otetaan rivit joiden parentid=-1 ja laajennetaan rivi uudella taululla t2 jossa on sama id. Tämän jälkeen kelpuutetaan mukaan ne taulukon t2 rivit jotka ovat samanlaisia kuin oikean puoleinen rivi taikka ne rivit joiden t1.tasoid on t2.parentid.
Onkos kellään muulla ideoita?