Avatar billede Slettet bruger
06. marts 2007 - 14:48 Der er 6 kommentarer

Data fra 2 tabeller

Jeg har 2 tabeller idag

PointRunder
UserID    RundeID    Points
1    1    10
2    1    40
1    2    20
2    2    50
1    3    30
2    3    60

PointSpil
UserID    SpilID    Points
1    1    60
2    1    150

Jeg vil gerne have et udtræk der ser ud ala det her

UserID    SpilID    R1P    R2P    R3P    PointsGame
1    1    10    20    30    60
2    1    40    50    60    150

Nogle der kan hjælpe?
Avatar billede pierrehusted Nybegynder
06. marts 2007 - 15:27 #1
Måske noget i den her stil kan gøre det....

SELECT ps.UserID, ps.SpilID
, (SELECT point FROM PointRunder pr1 WHERE pr1.RundeID = 1 AND pr1.UserID = ps.UserID) as R1P
, (SELECT point FROM PointRunder pr1 WHERE pr1.RundeID = 2 AND pr1.UserID = ps.UserID) as R2P
, (SELECT point FROM PointRunder pr1 WHERE pr1.RundeID = 3 AND pr1.UserID = ps.UserID) as R3P
, (SELECT sum(point) FROM PointRunder pr1 WHERE pr1.UserID = ps.UserID) as PointsGame
FROM PointSpil ps


Personligt ville jeg nu lave en JOIN imellem de to tabeller, og så danne listningen i programmet.
Avatar billede pierrehusted Nybegynder
06. marts 2007 - 15:28 #2
Lille fejl rettet:


SELECT ps.UserID, ps.SpilID
, (SELECT point FROM PointRunder pr1 WHERE pr1.RundeID = 1 AND pr1.UserID = ps.UserID) as R1P
, (SELECT point FROM PointRunder pr2 WHERE pr1.RundeID = 2 AND pr2.UserID = ps.UserID) as R2P
, (SELECT point FROM PointRunder pr3 WHERE pr1.RundeID = 3 AND pr3.UserID = ps.UserID) as R3P
, (SELECT sum(point) FROM PointRunder pr1 WHERE pr1.UserID = ps.UserID) as PointsGame
FROM PointSpil ps
Avatar billede Slettet bruger
06. marts 2007 - 15:41 #3
Ok, nu begynder det faktisk at give mening.

Jeg har nu lavet den med de helt korrekte navne osv.

SELECT ps.UserID, ps.GameID, ps.Points
, (SELECT Points FROM PointsRounds pr1 WHERE pr1.RoundID = 1 AND pr1.UserID = ps.UserID) as R1P
, (SELECT Points FROM PointsRounds pr2 WHERE pr2.RoundID = 2 AND pr2.UserID = ps.UserID) as R2P
, (SELECT Points FROM PointsRounds pr3 WHERE pr3.RoundID = 3 AND pr3.UserID = ps.UserID) as R3P
FROM PointsGames ps

Det jeg måske skulle have fortalt er at
Avatar billede Slettet bruger
06. marts 2007 - 15:45 #4
OMG. der gik lige noget galt.

Det jeg måske skulle have fortalt er at RoundID er fleksible. Et Game består af flere rounds

Der er derfor en tabel kaldet rounds som indeholder et gameid og de roundid som nu hører til dette.

Tabellen Round

RoundID    GameID
1    1
2    1
3    1
4    1
5    2
6    2
7    2

Kan dette let og elegant inkorporeres? SQL skal køres med et GameID = 1 fx, alt afhængig af hvilket game der skal vises
Avatar billede Slettet bruger
08. marts 2007 - 10:31 #5
Hjælp, anyone?
Avatar billede pierrehusted Nybegynder
09. marts 2007 - 11:34 #6
Så fik jeg lidt tid til at kigge nærmere på opgaven/problemet.
 
 
Der er i første omgang ingen sammenhæng imellem PointRunder og PointSpil tabellerne. Der mangler et SpilId i PointRunder tabellen (så man kan se hvilket spil pointene hører til - hvis altså den enkelte spiller skal kunne spille flere spil).

Dvs.
CREATE TABLE exp_766438_PointRunder (UserId INT, SpilId INT, RundeId INT, Point INT);
CREATE TABLE exp_766438_PointSpil (UserId INT, SpilId INT, Point INT);

At have en tabel ved navn ROUND synes jeg ikke er en god løsning. For så er RoundID unikt i hele databasen - der kan altså kun være een eneste Round nr 1. (Men måske er det en god idé i det faktiske projekt, det ved jeg ikke).
 
 
Og selv om man sætter et SpilId ind i PointRunder, så har jeg svært ved at se hvad PointSpil's eksistentberettigelse er. Du kan få de samme data ved at GROUPe i PointRunder tabellen:
SELECT UserId, SpilId, SUM(Point) FROM exp_766438_PointRunder GROUP BY userid;

Og henter du data ved at GROUPe, så slipper du også for at have samme data flere steder.
 
 
Så mit (nye) forslag er altså at du nøjes med den her tabel:
CREATE TABLE exp_766438_PointRunder (UserId INT, SpilId INT, RundeId INT, Point INT);

Når du så vil vide resultatet af Spil nr 1 gør du sådan her:
SELECT UserId, SpilId, SUM(Point) FROM exp_766438_PointRunder WHERE SpilId = [din indsatte værdi] GROUP BY UserId, SpilId;


Du kan selvfølgelig sagtens kalde tabellen noget andet. Det er bare hvad jeg har kaldt den/dem mens jeg har siddet og eksperimenteret.
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