Avatar billede Mik2000 Professor
20. juli 2015 - 00:53 Der 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
Avatar billede bilbodog Nybegynder
20. juli 2015 - 08:26 #1
Hej mik2000!

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?

- Vh. bilbodog
Avatar billede erikjacobsen Ekspert
20. juli 2015 - 11:37 #2
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
Avatar billede Mik2000 Professor
21. juli 2015 - 01:55 #3
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
Avatar billede Mik2000 Professor
21. juli 2015 - 01:56 #4
Kan se du skriver du ikke samler på point - så hvis den skal lukkes så er denne parat - men afventer lige for at være sikker :)
Avatar billede erikjacobsen Ekspert
21. juli 2015 - 11:02 #5
Accepter blot dit eget 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.
Avatar billede Mik2000 Professor
22. juli 2015 - 15:28 #6
Tak for hjælpen :)

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 :)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester