14. august 2005 - 21:17Der er
73 kommentarer og 1 løsning
Sortere efter point
Hej med jer,
Jeg er i øjeblikket igang med at lave en oversigt over nogle brugeres stillinger i en turnering. Det er ligesom en fodboldturnering hvor der bliver scoret mål og derefter gives point. Mit problem ligger i at jeg skal have sorteret listen efter point som bliver udregnet for hver user. Userne bliver trukket ud fra min database, og derefter udregnet og sat ind.
Nogle der har en god ide til hvordan jeg kan få sorteret det efter points ?
Min kode er nogenlunde sådan:
Udtræk af brugere fra databasen, Loop disse igennem
Hent mål scoret fra en anden tabel og loop igennem dem for se samlet mål.
"select bruger.id, bruger.navn, count(maal.id) as AntalMaal from bruger left join maal on maal.brugerID=bruger.ID group by bruger.ID, bruger.navn order by AntalMaal"
strSQL = "SELECT user.id,user.clubname FROM user" Set rs = connection.Execute(strSQL) If Not (rs.EOF or rs.BOF) Then %> <table border="0" cellpadding="0" cellspacing="0" style="width:100%;"> <tr> <td></td> <td style="width:20px;">K</td> <td style="width:20px;">V</td> <td style="width:20px;">U</td> <td style="width:20px;">T</td> <td style="width:20px;">M+</td> <td style="width:20px;">M-</td> <td style="width:20px;">P</td> </tr> <% Do While Not (rs.EOF or rs.BOF)
strSQL = "SELECT DISTINCT match_player.matchid FROM match_player WHERE match_player.userid=" & rs("id") Set kRs = connection.Execute(strSQL) If Not (kRs.EOF or kRs.BOF) Then k = 0 Do While Not (kRs.EOF or kRs.BOF) k = k + 1 kRs.MoveNext Loop End if
strSQL = "SELECT match.id,match.user1,match.user2 FROM match WHERE match.user1=" & rs("id") Set matchRs = connection.Execute(strSQL) If Not (matchRs.EOF or matchRs.BOF) Then Do While Not (matchRs.EOF or matchRs.BOF)
'### Score 1 er dig selv strSQL = "SELECT match_player.score FROM match_player WHERE match_player.matchid=" & matchRs("id") & " AND match_player.userid=" & matchRs("user1") Set scoreRs = connection.Execute(strSQL) If Not (scoreRs.EOF or scoreRs.BOF) Then Do While Not (scoreRs.EOF or scoreRs.BOF)
strScore1 = strScore1 + scoreRs("score")
strA1 = strA1 + scoreRs("score")
scoreRs.MoveNext Loop End if
strAA1 = strA1
strA1 = 0
'### Score 2 er modstander strSQL = "SELECT match_player.score FROM match_player WHERE match_player.matchid=" & matchRs("id") & " AND match_player.userid=" & matchRs("user2") Set scoreRs = connection.Execute(strSQL) If Not (scoreRs.EOF or scoreRs.BOF) Then Do While Not (scoreRs.EOF or scoreRs.BOF)
strScore2 = strScore2 + scoreRs("score")
strA2 = strA2 + scoreRs("score")
scoreRs.MoveNext Loop End if
strAA2 = strA2
strA2 = 0
If (Cint(strAA1) > Cint(strAA2)) Then strWon = (strWon + 1) strDraw = strDraw strLost = strLost
strSQL = "SELECT match.id,match.user1,match.user2 FROM match WHERE match.user2=" & rs("id") Set matchRs = connection.Execute(strSQL) If Not (matchRs.EOF or matchRs.BOF) Then Do While Not (matchRs.EOF or matchRs.BOF)
'### Score 3 er modstander strSQL = "SELECT match_player.score FROM match_player WHERE match_player.matchid=" & matchRs("id") & " AND match_player.userid=" & matchRs("user1") Set scoreRs = connection.Execute(strSQL) If Not (scoreRs.EOF or scoreRs.BOF) Then Do While Not (scoreRs.EOF or scoreRs.BOF)
strScore3 = strScore3 + scoreRs("score")
strA3 = strA3 + scoreRs("score")
scoreRs.MoveNext Loop End if
strAA3 = strA3
strA3 = 0
'### Score 4 er dig selv strSQL = "SELECT match_player.score FROM match_player WHERE match_player.matchid=" & matchRs("id") & " AND match_player.userid=" & matchRs("user2") Set scoreRs = connection.Execute(strSQL) If Not (scoreRs.EOF or scoreRs.BOF) Then Do While Not (scoreRs.EOF or scoreRs.BOF)
strScore4 = strScore4 + scoreRs("score")
strA4 = strA4 + scoreRs("score")
scoreRs.MoveNext Loop End if
strAA4 = strA4
strA4 = 0
If (Cint(strAA4) > Cint(strAA3)) Then strWon = (strWon + 1) strDraw = strDraw strLost = strLost
Jeg skal lige have en database/tabel oversigt over de 3 tabeller user, match og match_player. Hvordan hænger de sammen og hvilke data indeholder tabellerne (Jeg skal bare bruge et lille eks på data, så jeg er sikker på hvordan det ser ud)
Jeg kan ikke helt finde ud af hvordan det fungere (måske pga navngivning..)
User tabellen indeholder den enkelte klub?? Match har jeg fattet. Matchplay er scoren, men hvordan hænger den sammen med match, og hvad er name i den sammenhæng??
Grundlæggende er det et managerspil på nettet, hvor hver bruger har oprettet et hold med nogle spillere. I usertabellen, står alle de oprettede bruger, med deres selvvalgte klubnavn.
Når en spiller score i virkelighedens fodbold, vil spilleren i match_player få et point i score. Match_player indeholder de spillere som brugerne har valgt på deres hold.
Matchid er referencen til den enkelte match fra tabellen match. Player er den enkelte spiller, score er scoren for spilleren og userid er referencen til den bruger som har holdet
Som jeg kan se det, kan vi så gå helt uden om Match tabellen, hvis du bare skal have en topliste:
"select User.ID,User.clubname,sum(score)*3 as total FROM user inner join Match_Player on Match_Player.UserID=User.ID group by User.ID,User.clubname order by total"
Det vil ikke helt kunne lade sig gøre tror jeg, da den ikke kun udregner score men også vundne kampe, tabte kampe, uafgjorte kampe, mål ind, mål ud og samlede points
Der er et lille problem. Vi skal sammenligne scoren på 2 klubber og tildele vinderen 3 point. Det kan ikke gøres i Access uden at skulle bruge moduler (ved ikke engang om det kan gøres her).
Den nemme løsning er derfor at smide et par ekstra felter på match.
Match: ID UserID1 UserID2 Point1 Point2
Point skal så bare tildelse 3, 1 eller 0 point. Det burde ikke være nødvendig at lave (mål)score her også, da den burde kunne udregnes.
Jeg vil nok også fortrække den løsning (med ekstra felter), da Access ikke er den bedste/hurtigste database, og at skulle lave alle disse sammenligninger lægger pres på den.
Det eneste du skal indberette, ud over det sædvanlige, er jo kun, hvem der har vundet kampen, eller om den er uafgjort. Det kan gøres med et ASP script, som beregner det for dig, hvis du ikke selv vil lægge scoren for holdene sammen og sammenligne dem :o)
Når en kamp er afslutte tlideles der point til hver spille på banen, og vinder klubben er den med samlet flest point. Spilleren kan vel ikke få flere point senere (ud over i en ny kamp)??
Så ved du jo også at resultatet skal rettes, og gør det i samme omgang. Somsagt er det er simpet script som gør det. Det kan laves som en funktion, som bare skal have kampID'et med som parameter.
function beregnPoints(funkMatchID) dim funkRS1,funkRS2 'Find point for hver klub set funkRS1 = conn.execute("select sum(score) as point from match_player a inner join match b on a.userid=b.user1 and a.matchid=b.id where b.id="& funkMatchID) set funkRS2 = conn.execute("select sum(score) as point from match_player a inner join match b on a.userid=b.user2 and a.matchid=b.id where b.id="& funkMatchID) 'tjek om der er data if (not funkRS1.eof) and (not funkRS2.eof) then 'tjek om data er tal if isnumeric(funkRS1("point")&"") and isnumeric(funkRS2("point")&"") then 'updater match udfra points if funkRS1("point") < funkRS2("point") then conn.execute("update match set point1=0, point2=3 where id="& funkMatchID) elseif funkRS1("point") > funkRS2("point") then conn.execute("update match set point1=3, point2=0 where id="& funkMatchID) else conn.execute("update match set point1=1, point2=1 where id="& funkMatchID) end if end if end if 'Luk recordset med fejlhåndtering hvis de ikke er blevet åbnet on error resume next funkRS1.close funkRS2.close set funkRS1 = nothing set funkRS2 = nothing on error goto 0 end function
select id, clubname, sum(point) from ( select a.id, a.clubname, sum(b.point1) as point from user a inner join match b on a.id=b.user1 group by a.id, a.clubname union select a.id, a.clubname, sum(b.point2) as point from user a inner join match b on a.id=b.user2 group by a.id, a.clubname ) group by id, clubname order by sum(point) desc
strSQL = "select id, clubname, sum(point) from (" strSQL = strSQL & " select a.id, a.clubname, sum(b.point1) as point from user a inner join match b on a.id=b.user1 group by a.id, a.clubname" strSQL = strSQL & " union" strSQL = strSQL & " select a.id, a.clubname, sum(b.point2) as point from user a inner join match b on a.id=b.user2 group by a.id, a.clubname)" strSQL = strSQL & " group by id, clubname" strSQL = strSQL & " order by sum(point) desc" Set rs = connection.Execute(strSQL)
Prøvede også det her: strSQL = "select id, clubname, sum(point) from (select a.id, a.clubname, sum(b.point1) as point from user a inner join match b on a.id=b.user1 group by a.id, a.clubname union select a.id, a.clubname, sum(b.point2) as point from user a inner join match b on a.id=b.user2 group by a.id, a.clubname) group by id, clubname order by sum(point) desc" Set rs = connection.Execute(strSQL)
Men den samme fejl kommer: Microsoft][ODBC Microsoft Access-driver] Der er for få parametre. Der var ventet 2.
strSQL = "select id, clubname, sum(point) "&_ "from ("&_ " select a.id, a.clubname, sum(b.point1) as point "&_ " from (user a inner join match b on a.id=b.user1) "&_ " group by a.id, a.clubname "&_ " union "&_ " select a.id, a.clubname, sum(b.point2) as point "&_ " from (user a inner join match b on a.id=b.user2) "&_ " group by a.id, a.clubname) "&_ "group by id, clubname "&_ "order by sum(point) desc" Set rs = connection.Execute(strSQL)
og alle tabel/kolonnenavne er skrevet rigtigt og kolonnerne eksistere også i de tabeller der selectes fra??
Prøv at køre denne:
"select a.id, a.clubname, sum(b.point1) as point "&_ "from (user a inner join match b on a.id=b.user1) "&_ "group by a.id, a.clubname "&_ "union "&_ "select a.id, a.clubname, sum(b.point2) as point "&_ "from (user a inner join match b on a.id=b.user2) "&_ "group by a.id, a.clubname) "
strSQL = "select a.id, a.clubname, sum(b.point1) as point "&_ "from (user a inner join match b on a.id=b.user1) "&_ "group by a.id, a.clubname "&_ "union "&_ "select a.id, a.clubname, sum(b.point2) as point "&_ "from (user a inner join match b on a.id=b.user2) "&_ "group by a.id, a.clubname) " Set rs = connection.Execute(strSQL)
Giver fejlen: Microsoft][ODBC Microsoft Access-driver] Der er en syntaksfejl i foreningsforespørgslen.
Sådan... Jeg har rettet det ;) Jeg var lidt træt da jeg lavede det, og overså at du havde kaldt den point1 og point2 og jeg havde kaldt det score1 og score 2
Denne kode virker:
strSQL = "select id, clubname, sum(point) "&_ "from ("&_ " select a.id, a.clubname, sum(b.score1) as point "&_ " from (user a inner join match b on a.id=b.user1) "&_ " group by a.id, a.clubname "&_ " union "&_ " select a.id, a.clubname, sum(b.score2) as point "&_ " from (user a inner join match b on a.id=b.user2) "&_ " group by a.id, a.clubname) "&_ "group by id, clubname "&_ "order by sum(point) desc" Set rs = connection.Execute(strSQL)
strSQL = "select id, clubname, sum(point) "&_ "from ("&_ " select a.id, a.clubname, sum(b.score1) as point "&_ " from (user a inner join match b on a.id=b.user1) "&_ " group by a.id, a.clubname "&_ " union "&_ " select a.id, a.clubname, sum(b.score2) as point "&_ " from (user a inner join match b on a.id=b.user2) "&_ " group by a.id, a.clubname) "&_ "group by id, clubname "&_ "order by sum(point) desc" Set rs = connection.Execute(strSQL)
If Not (rs.EOF or rs.BOF) Then %> <table border="0" cellpadding="0" cellspacing="0" style="width:100%;"> <tr> <td></td> <td style="width:20px;">K</td> <td style="width:20px;">V</td> <td style="width:20px;">U</td> <td style="width:20px;">T</td> <td style="width:20px;">M+</td> <td style="width:20px;">M-</td> <td style="width:20px;">P</td> </tr> <% Do While Not (rs.EOF or rs.BOF)
strSQL = "SELECT DISTINCT match_player.matchid FROM match_player WHERE match_player.userid=" & rs("id") Set kRs = connection.Execute(strSQL) If Not (kRs.EOF or kRs.BOF) Then k = 0 Do While Not (kRs.EOF or kRs.BOF) k = k + 1 kRs.MoveNext Loop End if
strSQL = "SELECT match.id,match.user1,match.user2,match.score1,match.score2 FROM match WHERE match.user1=" & rs("id") Set matchRs = connection.Execute(strSQL) If Not (matchRs.EOF or matchRs.BOF) Then Do While Not (matchRs.EOF or matchRs.BOF)
strSQL = "SELECT match.id,match.user1,match.user2,match.score1,match.score2 FROM match WHERE match.user2=" & rs("id") Set matchRs = connection.Execute(strSQL) If Not (matchRs.EOF or matchRs.BOF) Then Do While Not (matchRs.EOF or matchRs.BOF)
select id, clubname, sum(point), sum(mP) from ( select a.id, a.clubname, sum(b.score1) as point, 0 as mP from (user a inner join match b on a.id=b.user1) group by a.id, a.clubname union select a.id, a.clubname, sum(b.score2) as point, 0 as mP from (user a inner join match b on a.id=b.user2) group by a.id, a.clubname union select a.id, a.clubname, 0 as point, sum(c.score) as mP from (user a inner join match b on a.id=b.user1) left join match_player c on (c.userID=b.user1 and b.ID=c.matchID) group by a.id, a.clubname union select a.id, a.clubname, 0 as point, sum(c.score) as mP from (user a inner join match b on a.id=b.user2) left join match_player c on (c.userID=b.user2 and b.ID=c.matchID) group by a.id, a.clubname) group by id, clubname order by sum(point) desc, sum(mP) desc
Du har desuden misforstået meningen med score1 og score2 på match tabellen. De skal indeholde "vinder/taber" oplysninger og kan derfor kun indeholde værdierne 3, 1 og 0 afhængig af om kampen er vundet, uafgjort eller tabt.
Jeg har rette på pointtildelingen i match_player, da alle havde fået 2 point, og jeg ville have nogle forskelle. Har desuden også rettet scoreX i match.
Skal jeg fjerne databasen igen når du har hentet den??
I "forespørgelser" lave specielle database udtræk i access. F.eks udtræk over flere tabeller. Der et hjælpe værktøj til at lave udtræk, men man kan også slå den over i SQL-visning også kan man selv skrive SQL-sætningerne.
Kan du ikke lave den uden at have forespørgelsen i databasen ;) Men bare den base som jeg oprindelig havde lavet ? ;-) Det gør det lidt nemmere, hvis jeg en dag skal forstå det ;)
SELECT id, clubname,sum(kampe) as kTotal, sum(point) as pTotal, sum(mP) as mPTotal, sum(mM) as mMTotal FROM [select a.id, a.clubname, count(b.id) as kampe, sum(b.score1) as point, 0 as mP, 0 as mM from (user a inner join match b on a.id=b.user1) group by a.id, a.clubname union select a.id, a.clubname, count(b.id) as kampe, sum(b.score2) as point, 0 as mP, 0 as mM from (user a inner join match b on a.id=b.user2) group by a.id, a.clubname union select a.id, a.clubname, 0 as kampe, 0 as point, sum(c.score) as mP, 0 as mM from (user a inner join match b on a.id=b.user1) left join match_player c on (c.userID=b.user1 and b.ID=c.matchID) group by a.id, a.clubname union select a.id, a.clubname, 0 as kampe, 0 as point, sum(c.score) as mP, 0 as mM from (user a inner join match b on a.id=b.user2) left join match_player c on (c.userID=b.user2 and b.ID=c.matchID) group by a.id, a.clubname union select a.id, a.clubname, 0 as kampe, 0 as point, 0 as mP, sum(c.score) as mM from (user a inner join match b on a.id=b.user1) left join match_player c on (c.userID=b.user2 and b.ID=c.matchID) group by a.id, a.clubname union select a.id, a.clubname, 0 as kampe, 0 as point, 0 as mP, sum(c.score) as mM from (user a inner join match b on a.id=b.user2) left join match_player c on (c.userID=b.user1 and b.ID=c.matchID) group by a.id, a.clubname
]. AS tempTable GROUP BY id, clubname ORDER BY sum(point) DESC , sum(mP) DESC, sum(mM) asc
Den trækker ikke V U T ud, men det kan trækkes ud bagefter.
I ASP bliver det: <table> <tr> <td>Klub</td> <td>Kampe</td> <td>M+</td> <td>M-</td> <td>Point</td> </tr> <% set rs = connection.execute("... hele SQL'en ...") while not rs.eof %> <tr> <td><%= rs("clubname") %> <td><%= rs("kTotal") %> <td><%= rs("mPTotal") %> <td><%= rs("mMtotal") %> <td><%= rs("pTotal") %> </tr> <% rs.MoveNext wend %>
'strSQL = "SELECT user.id,user.clubname FROM user" 'strSQL = "SELECT User.ID,User.clubname,sum(score)*3 as total FROM user inner join Match_Player on Match_Player.UserID=User.ID group by User.ID,User.clubname order by total"
'strSQL = "select a.id, a.clubname, sum(b.point1) as point "&_ '"from (user a inner join match b on a.id=b.user1) "&_ '"group by a.id, a.clubname "&_ '"union "&_ '"select a.id, a.clubname, sum(b.point2) as point "&_ '"from (user a inner join match b on a.id=b.user2) "&_ '"group by a.id, a.clubname) " 'Set rs = connection.Execute(strSQL)
strSQL = "SELECT id, clubname,sum(kampe) as kTotal, sum(point) as pTotal, sum(mP) as mPTotal, sum(mM) as mMTotal"&_ " FROM [select a.id, a.clubname, count(b.id) as kampe, sum(b.score1) as point, 0 as mP, 0 as mM"&_ " from (user a inner join match b on a.id=b.user1)"&_ " group by a.id, a.clubname "&_ " union "&_ " select a.id, a.clubname, count(b.id) as kampe, sum(b.score2) as point, 0 as mP, 0 as mM"&_ " from (user a inner join match b on a.id=b.user2)"&_ " group by a.id, a.clubname"&_ " union"&_ " select a.id, a.clubname, 0 as kampe, 0 as point, sum(c.score) as mP, 0 as mM"&_ " from (user a inner join match b on a.id=b.user1) left join match_player c on (c.userID=b.user1 and b.ID=c.matchID)"&_ " group by a.id, a.clubname"&_ " union"&_ " select a.id, a.clubname, 0 as kampe, 0 as point, sum(c.score) as mP, 0 as mM"&_ " from (user a inner join match b on a.id=b.user2) left join match_player c on (c.userID=b.user2 and b.ID=c.matchID)"&_ " group by a.id, a.clubname"&_ " union"&_ " select a.id, a.clubname, 0 as kampe, 0 as point, 0 as mP, sum(c.score) as mM"&_ " from (user a inner join match b on a.id=b.user1) left join match_player c on (c.userID=b.user2 and b.ID=c.matchID)"&_ " group by a.id, a.clubname"&_ " union"&_ " select a.id, a.clubname, 0 as kampe, 0 as point, 0 as mP, sum(c.score) as mM"&_ " from (user a inner join match b on a.id=b.user2) left join match_player c on (c.userID=b.user1 and b.ID=c.matchID)"&_ " group by a.id, a.clubname"&_ " ]. AS tempTable"&_ " GROUP BY id, clubname"&_ " ORDER BY sum(point) DESC , sum(mP) DESC, sum(mM) asc " Set rs = connection.Execute(strSQL)
If Not (rs.EOF or rs.BOF) Then %> <table border="0" cellpadding="0" cellspacing="0" style="width:100%;"> <tr style="font-weight:bold;"> <td></td> <td style="width:20px;">K</td> <td style="width:20px;">V</td> <td style="width:20px;">U</td> <td style="width:20px;">T</td> <td style="width:20px;">M+</td> <td style="width:20px;">M-</td> <td style="width:20px;">P</td> </tr> <% Do While Not (rs.EOF or rs.BOF)
strSQL = "SELECT DISTINCT match_player.matchid FROM match_player WHERE match_player.userid=" & rs("id") Set kRs = connection.Execute(strSQL) If Not (kRs.EOF or kRs.BOF) Then k = 0 Do While Not (kRs.EOF or kRs.BOF) k = k + 1 kRs.MoveNext Loop End if
strSQL = "SELECT match.id,match.user1,match.user2,match.score1,match.score2 FROM match WHERE match.user1=" & rs("id") Set matchRs = connection.Execute(strSQL) If Not (matchRs.EOF or matchRs.BOF) Then Do While Not (matchRs.EOF or matchRs.BOF)
strSQL = "SELECT match.id,match.user1,match.user2,match.score1,match.score2 FROM match WHERE match.user2=" & rs("id") Set matchRs = connection.Execute(strSQL) If Not (matchRs.EOF or matchRs.BOF) Then Do While Not (matchRs.EOF or matchRs.BOF)
match.score1 og match.score2 SKAL KUN indeholde værdierne 0, 1 eller 3. Så ikke noget med at indtaste 15 og 16 som du havde.
Hvis du tjekker match_player.score vil du se at alle personer har fået 2 point, derfor giver m+ og m- 14 da der er 7*2 score pr hold.
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.