Avatar billede rane Nybegynder
10. marts 2004 - 13:46 Der er 6 kommentarer og
1 løsning

SQL problem

Hejsa,

denne her er lidt avanceret, deraf det store points-tal.

vha. 3 tabeller skal jeg have udtrukket og sorteret en værdi til hver enkelt person. SQL'en ser således ud:

sql1 = "select top 25 events.SpillerID, sum(vaerdi) + (playerstats.tackles*0.001) as bissescore from events,beregning, playerstats where events.EventType=beregning.event and events.spillerid = playerstats.playerid and events.rundenr = playerstats.rundenr and events.RundeNr < 5 group by events.SpillerId, playerstats.tackles order by sum(vaerdi) + (playerstats.tackles*0.001) desc"

TABEL "EVENTS":
---------------
EventType | SpillerID
gult      |  22445566
roedt    |  22112222
gult      |  22111111

TABEL "PLAYERSTATS":
PlayerID (SpillerID) | Tackles
22445566            |  21
22112222            |  12
22111111            |  17

TABEL "BEREGNING":
Event | Vaerdi
gult  |  1
roedt |  2,5

------------------------------------------
Som i måske nok kan se, giver et gult kort 1 points osv. SQL sætningen virker næsten, idet den sortere spillerne efter hvem der har flest kort-points. MEN:

*Den medtager kun Tackles hvis en spiller har fået et gult eller rødt kort i samme spillerunde*

Jeg vil gerne have den til at medberegne Tackles selvom en spiller intet kort har fået. Altså kalkulen:

(Antal rødekort * 2,5) + (Antal gulekort * 1) + (Antal tackles * 0,001) = Samlet points for hver spiller.

Se evt. tråden: http://www.eksperten.dk/spm/471481
Avatar billede fennec Nybegynder
10. marts 2004 - 14:03 #1
du skal have lavet et outer join. Noget i denne stil:

select .... from playerstats left outer join EVENTS on PLAYERSTATS.PlayerId=EVENTS.SpillerID left join beregning on events.EventType=beregning.event where...
Avatar billede rane Nybegynder
10. marts 2004 - 14:12 #2
Ok den er jeg ikke helt med på. Min originale SQL-sætning virker som sådan ok, med undtagelse af Playerstats.Tackles som den kun tager noget af det med. Kan du forklare det lidt nærmere om dine joins løser dette sidstnævnte problem?
Avatar billede fennec Nybegynder
10. marts 2004 - 14:25 #3
Jeg ved ikke lige hvordan jeg skal forklare det, men prøv med dette eks.

TABEL "user"
id  Navn
1  mig
2  dig
3  andre

TABEL test
userid  andenDate
1      "test1"
2      "test2"

"select user.* from user left join test on test.userid= user.id"
vil returnere 2 rækker

"select user.* from user left outer join test on test.userid= user.id"
vil returnere 3 rækker

du kan sikkert prøve med dette hvis der ellers er mere data i din tabel en du har angivet.

"select PLAYERSTATS.* from PLAYERSTATS left join EVENTS on EVENTS.SpillerID= PLAYERSTATS.PlayerID"
"select PLAYERSTATS.* from PLAYERSTATS left outer join EVENTS on EVENTS.SpillerID= PLAYERSTATS.PlayerID"
Avatar billede fennec Nybegynder
10. marts 2004 - 15:33 #4
Nu kan jeg huske hvordan jeg fik det forklaret.....

tegn to cirkler på et stykke papir, og lad dem overlappe hinaden. De to cirkler er to tabeller, og det der overlapper hinanden er de records som de har tilfældes. En inner join medtager kun dem der er i begge tabelle, mens en left outer join medtager det overlappet og det til venstre. Nogle databaser understøtter også right outer join hvilket giver den anden halvdel, men det kan altid klares ved at bytte om på join rækkefølgen, hvorfor den "aldrig" bliver brugt.

Håber du forstod det.....

ps. I mange tilfælde vil der ikke være en del til højre, da alle i denne tabel også er i den venstre.
Avatar billede rane Nybegynder
10. marts 2004 - 18:06 #5
Jeg forstår da også en smule af JOIN generelt, men kan bare ikke lige se, hvordan den løsning skal se ud, så den virker med Tackles :/
Avatar billede fennec Nybegynder
11. marts 2004 - 08:17 #6
kan du ikke lige fortælle mig hvilke felter der er i de 3 tabeller, for jeg kan se at der er andre felter som du også join'er på (playerstats.rundenr, events.RundeNr), og hvilke data du vil have ud. så skal jeg nok prøve at lave en sql der virker....
Avatar billede rane Nybegynder
11. marts 2004 - 17:15 #7
Jeg fik en kammersjuk til at hjælpe mig frem til en løsning der virker. Tilsyneladende bliver SQL'en ikke alt for køn og jeg skulle nok have omstruktureret tabellerne så det ikke ville blive så avanceret. Anyway, her er den SQL vi kom frem til:

sql1 = "SELECT TOP 25 [playerstats].[PlayerID], (SELECT IIF(SUM([beregning].[vaerdi]) IS NOT NULL, SUM([beregning].[vaerdi]), 0) FROM [events] LEFT JOIN [beregning] ON [beregning].[Event] = [events].[EventType] WHERE [events].[SpillerID] = [playerstats].[PlayerID]) + (SELECT SUM([playerstats2].[tackles] * 0.001) FROM [playerstats] AS [playerstats2] WHERE  [playerstats2].[playerID] = [playerstats].[playerID]) AS [Score] FROM [playerstats] GROUP BY [playerstats].[playerID] ORDER BY 2 DESC"

Jeg laver den altså lige som et svar, da jeg desværre ikke rigtig kunne bruge dit svar 100%. Men hvis du selv lige fikser et svar får du da lige lidt af de 200 points - vi skulle jo netop bruge en left join :)
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
Kurser inden for grundlæggende programmering

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