Avatar billede shaagerup Nybegynder
30. januar 2006 - 16:56 Der er 4 kommentarer og
1 løsning

Avanceret JOIN-problem

Jeg ønsker en SQL-sætning, hvis output (også kolonner) afhænger fuldstændig af indholdet af en tabel.

Eksempel:

--> SELECT * FROM testtable

id | entryid | fieldname | content
------------------------------
1 | 1 | test1 | blah1
2 | 1 | test2 | blah2
3 | 1 | test3 | blah3
4 | 2 | test4 | blah4
5 | 2 | test1 | blah5
6 | 2 | test2 | blah6

Resultatet af den ønskede SQL-sætning:

entryid |  test1 | test2 | test3 | test4
----------------------------------------
1 | blah1 | blah2 | blah3 | NULL
2 | blah5 | blah6 | NULL | blah4


Jeg er klar over, at dette kan klares med en masse LEFT JOINs, hvor man refererer specifikt til bestemte "fieldnames" -- det jeg ønsker, er mere generel løsning, og som samtidig er hurtig.

Havet du idéer - gode som dårlige, færdige som ufærdige -- hold dem ikke tilbage! :-)
Avatar billede barklund Nybegynder
30. januar 2006 - 17:31 #1
Skal du bruge alle disse data uden at udelade nogle? I så fald ville jeg nok hente alt ud og mappe det i din applikationslag.

Det lyder ikke umiddelbart som et job for en DBMS - eller også er det blot skidt databasedesign :)

:)

--
Morten Barklund
Avatar billede erikjacobsen Ekspert
30. januar 2006 - 18:43 #2
Din `testtable` ser ud til at have et fornuftigt design. Resultatet ser ud til at være en fornuftig måde at vise det på til brugeren. Men det er noget man programmerer i programmet/scriptet bagved, ikke i SQL. Så jeg er helt enig med barklund.
Avatar billede shaagerup Nybegynder
30. januar 2006 - 19:45 #3
Hm.. ok.

Udfordringen er så bare under alle omstændigheder, at få det til at køre hurtigt, når man tænker på, at der sagtens kan være flere 100.000 linjer i testtable.

Jeg har sjældent brug for det fulde output (dog bruges dette i forbindelse med Excel-eksport fra hjemmesiden), men jeg har snarere brug for at kunne lave nogle udregninger på dataene - på en hurtig måde!

Måske er det ikke i første omgang så smart, at lave den "omrokering" af outputtet, som jeg ellers kunne tænke mig - det ser jo tilsyneladende ikke ud til at kunne lade sig gøre.. [dog er jeg alligevel interesseret i at vide noget om, hvordan man arbejder med så store datamængder i et script - sproget er ASP, men referér til det, I kender til]

Jeg nu et andet, relevant spørgsmål:

Det forholder sig sådan, at det er nogle temmeligt avancerede sammenhænge, der bestemmer hvilke entryids, som skal danne grundlag for yderligere beregning. Derfor har jeg i første omgang en seperat SQL-sætning, som blot giver en kolonne med de ønskede entryids [denne tager ca. 1 sek at køre]. Dette lagres så i en kommasepereret streng, og hver eneste gang der skulle sendes en forespørgsel henvises til denne:

f.eks: "... WHERE entryid IN (" & entryids & ")"

Problemet er, at det tager ~ 7 sekunder for MySQL at medregne dette forbehold (uden forbeholdet, tager det 0.07 sekunder).

Jeg har også prøvet at indsætte den oprindelige SQL-sætning mellem paranteserne - dette tager 4-10 sekunder.

Er der ikke en måde at få det til at køre hurtigere?
Avatar billede erikjacobsen Ekspert
30. januar 2006 - 23:08 #4
Du har et index på entryID ?
Avatar billede shaagerup Nybegynder
26. august 2007 - 19:58 #5
Jeg kan ikke huske hvad udfaldet blev på dette - i hvert fald er spørgsmålet uddateret, og lukkes.
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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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