20. juli 2015 - 00:53Der er
5 kommentarer og 1 løsning
SQL select sætning - helt bar bund
Hej
Jeg har en tabel som følger
TABEL: Placeringer pId pSubId pOrder pName
pSubId:0 = toppunkt pSubId:tal>0 = id på det punkt det tilhører pOrder = rækkefølge
Jeg vil gerne skrive noget SQL som kan hente det hele ud på en gang sorteret efter pOrder, hvor alle underpunkter kommer under det rigtige punkt.
Det skal være SQL der gør det og ikke noget PHP efterfølgende.
Herunder er et eksempel
Her ligger følgende data pId pSubId pOrder pName 1 0 1 Danmark 2 1 1 Århus 3 1 3 København 4 0 3 England 5 4 2 Manchester 6 4 1 London 7 1 2 Odense 8 0 2 Tyskland 9 8 1 Flensborg
Data der kommer ud skal ende med at være som i understående i den rækkefølge
Danmark (pOrder 1) Århus (pOrder 1) Odense (pOrder 2) København (pOrder 3) Tyskland (pOrder 2) Flensborg (pOrder 1) England (pOrder 3) London (pOrder 1) Manchester (pOrder 2)
Dvs rå data: Danmark Århus Odense København Tyskland Flensborg England London Manchester
Jeg kan godt SQL på et normalt niveau, men kan ikke greje denne. Har være omkring meget både med nested sql, group by osv - men intet fungerer.
Håber det er til at forstå og at du kan hjælpe :) Spørg endelig
Jeg kan ikke helt se hvad du sortere efter. Du skal jo have noget og sortere efter, ellers skal du 'customize' din sortering, det kan man også godt, men kan bare ikke lige se hvad du gerne vil have der skal sorteres efter?
Det er da noget rod du har her. Sådan repræsenterer man ikke data i tabeller. Der er grunde til at man skal uddanne sig og fx lære noget om klassediagrammer og/eller E/R-diagrammer.
Der er noget, der kunne tyde på at to tabeller, een med lande og een med byer, med en passende associering kunne bruges...
Men et godt hack er jo altid sjovt. Det ser ud til at virke, og har du mere end 100 byer, kan du bare gange med noget der er større end 100. Kig på det, leg med det, og lav så din tabel om.
select t1.pOrder*100+t2.pOrder as theorder,t2.pName from test1 t1 left join test1 t2 on t1.pId=t2.pSubId where t1.pSubId=0 union all select test1.pOrder*100 as theorder, test1.pName from test1 where test1.pSubId=0 order by theorder
Tak for svar - det ser ud til at virke som det skal - der er selvfølgelig point :).
Nu er det egentlig fordi det er en stærkt forenklet version hvor jeg ændret det til lande, som gjorde det nemmere at forklare her.
Det er egentlig sider (og subsider), og det er struktureret sådan, fordi det senere skal kunne være uendeligt antal niveauer, hvor der skal laves en rekursiv funktion - men lige til at starte med vil der kun være 2 niveauer, og der skal jeg bare bruge noget SQL som kan hente det ud. Havde egentlig lavet en rekursiv funktion (som kunne bruges senere også), men så blev jeg nysgerrig om man ikke kunne gøre det i et kald så længe der kun var 2 niveauer, og dermed optimere det indtil da.
Omkring klassediagrammer og ER diagrammer så kender jeg udmærket det og har haft det på de 3 uddannelser jeg har, og har brugt det flere gange både privat og arbejdsmæssigt. Det er i øvrigt også brugt i dette projekt. Men vil ikke kunne have flere tabeller uden at skulle laves det om så snart niveauerne blev uendelige, da jeg ellers i princippet skulle have et uendeligt antal tabeller med sub, subsub osv, en en hoved og sub tabel som vil have redundans og gøre det langsommere. Vil både gøre det tungere og mere besværligt.
Men tak for SQL forslaget som fungerer - der er selvfølgelig point hvis du lægger svar
Det er principielt meget nemt at se om man har en god løsning i SQL (eller om SQL er velegnet til det), for hvis den SQL man skal skrive er for "spaghetti-kode-agtigt", så er det nok slemt.
Man kan komme en del videre med stored procedures. MySql er dog noget begrænsende i den del.
Kan sagens følge dig, men kan ikke se nogen anden løsning - uden at skulle bruge f.eks. NoSQL - eksempelvis MongoDB - som jeg også har arbejdet en del med - men det er bare for tidskrævende i forhold det som denne side skal kunne :)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.