Avatar billede babyworm Nybegynder
14. august 2005 - 21:17 Der 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.

        Gange antal scoret mål med 3 points.


            Udskriv brugeren med points


:)
Avatar billede fennec Nybegynder
15. august 2005 - 08:57 #1
Det skal gøres i en select. Noget i denne stil:

"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"
Avatar billede babyworm Nybegynder
15. august 2005 - 09:00 #2
Her er min kode:

<!--#include virtual="/_global/protect.asp"-->
<!--#include virtual="/_global/dbconn.asp"-->
<%
openConn()

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


    strScore1     = 0
    strScore2     = 0
    strScore3     = 0
    strScore4     = 0


    strWon         = 0
    strDraw     = 0
    strLost     = 0
    strGoalOut    = 0
    strGoalIn    = 0
    strPoint    = 0   


    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

    ElseIf (Cint(strAA1) = Cint(strAA2)) Then
        strWon        = strWon
        strDraw     = (strDraw + 1)
        strLost    = strLost

    ElseIf (Cint(strAA1) < Cint(strAA2)) Then
        strWon    = strWon
        strDraw    = strDraw
        strLost    = (strLost + 1)

    End if



    matchRs.MoveNext
    Loop
    End if


    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

    ElseIf (Cint(strAA4) = Cint(strAA3)) Then
        strWon        = strWon
        strDraw     = (strDraw + 1)
        strLost    = strLost

    ElseIf (Cint(strAA4) < Cint(strAA3)) Then
        strWon        = strWon
        strDraw    = strDraw
        strLost     = (strLost + 1)

    End if




    matchRs.MoveNext
    Loop
    End if

   
    GoalOut = strScore1 + strScore4
    GoalIn  = strScore2 + strScore3


    WonPoint = strWon * 3
    DrawPoint = strDraw * 1
    LostPoint = strLost * 0

    Points = WonPoint + DrawPoint + LostPoint
%>
<tr>
  <td><%=rs("clubname")%></td>
  <td><%=k%></td>
  <td><%=strWon%></td>
  <td><%=strDraw%></td>
  <td><%=strLost%></td>
  <td><%=GoalOut%></td>
  <td><%=GoalIn%></td>
  <td><%=Points%></td>
</tr>
<%
rs.MoveNext
Loop
%>
</table>
<%
End if
closeConn()
%>



Det er points den skal sortere efter ;)
Avatar billede fennec Nybegynder
15. august 2005 - 09:16 #3
Det blev jo så lidt mere indviklet :o)

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)
Avatar billede babyworm Nybegynder
15. august 2005 - 09:28 #4
Jeg har:

User
Match
match_player


Usertabellen indeholder:
ID
clubname

Match består af id, user1 og user2, som er de kampe spillerne spiller mod hinanden.

Match_player indeholder user1 og user2's spillere med deres score...
Avatar billede babyworm Nybegynder
15. august 2005 - 09:33 #5
I usertabellen:    1    clubname1
                  2    clubname2

                  ID    user1        user2
I matchtabellen:  1        1            2
                  2        2            1

                  ID    name        userid    score
I matchplayer      1  player1        1      2
                  2  player2        1      2
                  3  player3        2      0
                  4  player4        2      1
Avatar billede babyworm Nybegynder
16. august 2005 - 00:19 #6
Er det til at finde ud af ?
Avatar billede fennec Nybegynder
16. august 2005 - 08:10 #7
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??
Avatar billede babyworm Nybegynder
16. august 2005 - 08:25 #8
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.

Match_player ser nøjagtig sådan ud:

ID  MATCHID  PLAYER  SCORE    USERID
Avatar billede babyworm Nybegynder
16. august 2005 - 08:43 #9
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
Avatar billede fennec Nybegynder
16. august 2005 - 09:00 #10
Er dette så en rigtigt opfattet af databasen:

User:
ID Klubnavn (+flere kolonner som ikke betyder noget her)

Match:
ID UserID1 UserID2

Match_Player
ID MatchID Player Score UserID

Nøgler:
match.userID1 = User.ID
match.userID2 = User.ID
Match_Player.MatchID=Match.ID
Match_Player.UserID=User.ID
Avatar billede babyworm Nybegynder
16. august 2005 - 09:05 #11
Jepper :)
Avatar billede fennec Nybegynder
16. august 2005 - 09:16 #12
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"
Avatar billede babyworm Nybegynder
16. august 2005 - 09:25 #13
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
Avatar billede babyworm Nybegynder
16. august 2005 - 09:30 #14
Stillingen ser i øjeblikket sådan ud:

            K V U T M+ M- P
ASPcoders  4 1 1 2 17 27 4
Real France 4 2 1 1 27 17 7


Hvor den så skal sortere efter p i stedet
Avatar billede fennec Nybegynder
16. august 2005 - 09:38 #15
Bruger du en access database, for så ville det være nemmere hvis jeg kunne få den.
Avatar billede babyworm Nybegynder
16. august 2005 - 09:40 #16
Avatar billede babyworm Nybegynder
16. august 2005 - 09:46 #17
Sig lige når du har hentet den :)
Avatar billede fennec Nybegynder
16. august 2005 - 09:55 #18
Det -4 der står som score, er det 4 selvmål???
Avatar billede babyworm Nybegynder
16. august 2005 - 09:59 #19
ja... :) Det er i øjeblikket fiktive tal, men skal regnes som selvmål, gult eller rødt kort
Avatar billede fennec Nybegynder
16. august 2005 - 10:26 #20
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.
Avatar billede babyworm Nybegynder
16. august 2005 - 10:39 #21
Der er ikke en anden måde at gøre det på ?
Avatar billede fennec Nybegynder
16. august 2005 - 10:46 #22
Ikke uden at skulle lave et modul.

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)
Avatar billede babyworm Nybegynder
16. august 2005 - 11:07 #23
:) Hva så hvis en spiller får flere points, så vil det jo ikke automatisk rykke sig ?
Avatar billede fennec Nybegynder
16. august 2005 - 11:20 #24
Så tabte du mig igen :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)??
Avatar billede babyworm Nybegynder
16. august 2005 - 11:28 #25
Hvis der ved en fejl bliver indtastet det forkerte antal points, så skal det jo bare kunne rettes et sted :)
Avatar billede fennec Nybegynder
16. august 2005 - 11:33 #26
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.
Avatar billede babyworm Nybegynder
16. august 2005 - 11:43 #27
:) oki doki ... kan du lave det script ?
Avatar billede fennec Nybegynder
16. august 2005 - 16:36 #28
Kikker på det i morgen. Jeg har desværre haft meget travlt i dag, og nu vil jeg holder fri :o)
Avatar billede babyworm Nybegynder
16. august 2005 - 17:12 #29
Det lyder sku som en god ide ;)
Avatar billede fennec Nybegynder
17. august 2005 - 08:38 #30
Her har du den så :o)

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
Avatar billede fennec Nybegynder
17. august 2005 - 08:41 #31
Den kaldes så med:

call beregnPoints(123)
eller:
beregnPoints 123

Jeg foretrækker at bruge call metoden, da man her har parentes om attributterne, og det synes jeg er mere forstålig.
Avatar billede fennec Nybegynder
17. august 2005 - 08:59 #32
Til at finde topplacering kan du bruge:

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
Avatar billede fennec Nybegynder
18. august 2005 - 16:31 #33
Finder du ud af noget??
Avatar billede babyworm Nybegynder
19. august 2005 - 16:51 #34
Du må undskylde, men har haft mega travlt, så regner med at kigge på det, omkring søndag :)
Avatar billede babyworm Nybegynder
31. august 2005 - 02:28 #35
Min SQL ser nu sådan ud:

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)

Men det laver fejl ?
Avatar billede babyworm Nybegynder
31. august 2005 - 02:30 #36
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.
Avatar billede fennec Nybegynder
31. august 2005 - 08:13 #37
Prøv med denne:

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)
Avatar billede babyworm Nybegynder
31. august 2005 - 09:51 #38
[Microsoft][ODBC Microsoft Access-driver] Der er for få parametre. Der var ventet 2.
Avatar billede fennec Nybegynder
31. august 2005 - 10:40 #39
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) "
Avatar billede babyworm Nybegynder
31. august 2005 - 10:47 #40
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.
Avatar billede fennec Nybegynder
31. august 2005 - 10:50 #41
Kan du lige gøre din database offentlig igen, så jeg kan hente den med de ændringer der er lavet??
Avatar billede babyworm Nybegynder
31. august 2005 - 10:52 #42
Avatar billede babyworm Nybegynder
31. august 2005 - 10:55 #43
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)
Avatar billede babyworm Nybegynder
31. august 2005 - 10:59 #44
Kan man gøre det sådan at hvis f.eks. en bruger har samme point, så order den efter m+ `???
Avatar billede babyworm Nybegynder
31. august 2005 - 11:00 #45
hvis to brugere har samme point **
Avatar billede babyworm Nybegynder
31. august 2005 - 11:05 #46
Skriv lige når du har hentet basen ;)
Avatar billede fennec Nybegynder
31. august 2005 - 11:08 #47
Jeg kan ikke hente den :(
Avatar billede babyworm Nybegynder
31. august 2005 - 11:11 #48
Avatar billede fennec Nybegynder
31. august 2005 - 11:13 #49
Så er den hentet :o)
Avatar billede babyworm Nybegynder
31. august 2005 - 11:14 #50
Kan man gøre det med at sorte efter m+ hvis point er ens...
Avatar billede fennec Nybegynder
31. august 2005 - 11:24 #51
Det burde man, men hvordan finder man m+?? Altså hvilken table/kolonne er det??
Avatar billede babyworm Nybegynder
31. august 2005 - 11:25 #52
Her kan du se hele koden  :-)

<!--#include virtual="/_global/protect.asp"-->
<!--#include virtual="/_global/dbconn.asp"-->
<%
openConn()

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


    strScore1     = 0
    strScore2     = 0
    strScore3     = 0
    strScore4     = 0


    strWon         = 0
    strDraw     = 0
    strLost     = 0
    strGoalOut    = 0
    strGoalIn    = 0
    strPoint    = 0   


    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)

        strScore1 = matchRs("score1")
        strScore2 = matchRs("score2")


    If (Cint(strScore1) > Cint(strScore2)) Then
        strWon    = (strWon + 1)
        strDraw    = strDraw
        strLost    = strLost

    ElseIf (Cint(strScore1) = Cint(strScore2)) Then
        strWon        = strWon
        strDraw     = (strDraw + 1)
        strLost    = strLost

    ElseIf (Cint(strScore1) < Cint(strScore2)) Then
        strWon    = strWon
        strDraw    = strDraw
        strLost    = (strLost + 1)

    End if



    matchRs.MoveNext
    Loop
    End if


    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)


        strScore3 = matchRs("score1")
        strScore4 = matchRs("score2")



    If (Cint(strScore4) > Cint(strScore3)) Then
        strWon     = (strWon + 1)
        strDraw    = strDraw
        strLost    = strLost

    ElseIf (Cint(strScore4) = Cint(strScore3)) Then
        strWon        = strWon
        strDraw     = (strDraw + 1)
        strLost    = strLost

    ElseIf (Cint(strScore4) < Cint(strScore3)) Then
        strWon        = strWon
        strDraw    = strDraw
        strLost     = (strLost + 1)

    End if




    matchRs.MoveNext
    Loop
    End if

   
    GoalOut = strScore1 + strScore4
    GoalIn  = strScore2 + strScore3


    WonPoint = strWon * 3
    DrawPoint = strDraw * 1
    LostPoint = strLost * 0

    Points = WonPoint + DrawPoint + LostPoint
%>
<tr>
  <td><%=rs("clubname")%></td>
  <td><%=k%></td>
  <td><%=strWon%></td>
  <td><%=strDraw%></td>
  <td><%=strLost%></td>
  <td><%=GoalOut%></td>
  <td><%=GoalIn%></td>
  <td><%=Points%></td>
</tr>
<%
rs.MoveNext
Loop
%>
</table>
<%
End if
%>
Avatar billede babyworm Nybegynder
31. august 2005 - 11:26 #53
m+ er den som hedder GoalOut
Avatar billede fennec Nybegynder
31. august 2005 - 11:41 #54
rs("Point") og m+ er det ikke det samme???
Avatar billede babyworm Nybegynder
31. august 2005 - 11:46 #55
Nej... for GoalOut = strScore1 + strScore4
Avatar billede fennec Nybegynder
31. august 2005 - 12:37 #56
I den database jeg har fået, hvordan skal resultatet være der??
      K V U T M+ M- P
Hold1 ? ? ? ? ?  ?  ?
Hold2 ? ? ? ? ?  ?  ?
Avatar billede babyworm Nybegynder
31. august 2005 - 12:59 #57
Du kan se stillingen her:

http://217.157.170.71/stillingen.asp
Avatar billede fennec Nybegynder
31. august 2005 - 13:28 #58
Er det den samme database som jeg har fået??

Jeg har nemlig kun EN række i match og 14 rækker i match_player og der har de alle score=2
Avatar billede babyworm Nybegynder
31. august 2005 - 13:33 #59
Du får lige den base der er nu...

http://217.157.170.71/fennec.rar
Avatar billede fennec Nybegynder
01. september 2005 - 11:05 #60
Det tog mig lidt tid at klare, men her er den:

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.
Avatar billede babyworm Nybegynder
01. september 2005 - 11:46 #61
Den virker ikke... Kan man ikke lave det med point for hver ?
Avatar billede babyworm Nybegynder
01. september 2005 - 11:47 #62
K V U T M+ M- P
Real France  2 1 0 1 15 16 3
FC Plicity    2 1 0 1 16 15 3
Avatar billede fennec Nybegynder
01. september 2005 - 12:00 #63
Det virker ellers fint for mig. Prøv at se databasen her:
http://www.henriknygaard.dk/experten/cmplicity.mdb

forespørgsel2 giver resultaterne...

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??
Avatar billede babyworm Nybegynder
01. september 2005 - 12:04 #64
Kan du ikke sætte ligge stillingen.asp ud også ? Så jeg kan se at det virker ?
Avatar billede babyworm Nybegynder
01. september 2005 - 12:06 #65
Jeg har aldrig rodet med forespørgelser i access.. hva går det ud på ?
Avatar billede fennec Nybegynder
01. september 2005 - 12:09 #66
Jeg har ikke brugt den gennem ASP, men hvis SQL'en virker i access virker den også i ASP.

Jeg vil næsten tro jeg kan lave en SQL som trækker K V U T M+ M- P ud på en gang. Skal jeg prøve det??
Avatar billede fennec Nybegynder
01. september 2005 - 12:11 #67
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.
Avatar billede babyworm Nybegynder
01. september 2005 - 12:14 #68
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 ;)
Avatar billede fennec Nybegynder
01. september 2005 - 12:33 #69
De SQL-sætninger jeg laver i "forespørgelser" kan også bruges gennem ASP. Jeg behøver bare ikke en ASP side for at teste dem.

I ASP ville koden se sådan nu:

<table>
<tr>
  <td>Klub</td>
  <td>M+</td>
  <td>Point</td>
</tr>
<%
set rs = connection.execute("select id, clubname, sum(point), sum(mP) from ... resten fra 11:05:23 ...")
while not rs.eof %>
<tr>
  <td><%= rs("clubname") %>
  <td><%= rs(2) %>
  <td><%= rs(3) %>
</tr>
<%  rs.MoveNext
wend %>

Som sagt tror jeg at jeg kan lave en SQL der trækker det hele ud på en gang.
Avatar billede babyworm Nybegynder
01. september 2005 - 12:57 #70
må du gerne ;)
Avatar billede fennec Nybegynder
02. september 2005 - 09:40 #71
Så er den her:

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 %>
Avatar billede fennec Nybegynder
02. september 2005 - 09:44 #72
Hvis du gemmer SQL'en i en forespørgsel, kan du nøjes med at kalde den. Så er du fri for at have hele SQL'en til at stå i koden:

set rs = connection.execute("ForespørgselNavn")
Avatar billede babyworm Nybegynder
02. september 2005 - 09:49 #73
Hehe... Den virker ikke helt efter hensigten :)

Min kode:

<!--#include virtual="/_global/dbconn.asp"-->
<%
openConn()

'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


    strScore1     = 0
    strScore2     = 0
    strScore3     = 0
    strScore4     = 0


    strWon         = 0
    strDraw     = 0
    strLost     = 0
    strGoalOut    = 0
    strGoalIn    = 0
    strPoint    = 0   


    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)

        strScore1 = matchRs("score1")
        strScore2 = matchRs("score2")


    If (Cint(strScore1) > Cint(strScore2)) Then
        strWon    = (strWon + 1)
        strDraw    = strDraw
        strLost    = strLost

    ElseIf (Cint(strScore1) = Cint(strScore2)) Then
        strWon        = strWon
        strDraw     = (strDraw + 1)
        strLost    = strLost

    ElseIf (Cint(strScore1) < Cint(strScore2)) Then
        strWon    = strWon
        strDraw    = strDraw
        strLost    = (strLost + 1)

    End if



    matchRs.MoveNext
    Loop
    End if


    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)


        strScore3 = matchRs("score1")
        strScore4 = matchRs("score2")



    If (Cint(strScore4) > Cint(strScore3)) Then
        strWon     = (strWon + 1)
        strDraw    = strDraw
        strLost    = strLost

    ElseIf (Cint(strScore4) = Cint(strScore3)) Then
        strWon        = strWon
        strDraw     = (strDraw + 1)
        strLost    = strLost

    ElseIf (Cint(strScore4) < Cint(strScore3)) Then
        strWon        = strWon
        strDraw    = strDraw
        strLost     = (strLost + 1)

    End if




    matchRs.MoveNext
    Loop
    End if

   
    GoalOut = strScore1 + strScore4
    GoalIn  = strScore2 + strScore3


    WonPoint = strWon * 3
    DrawPoint = strDraw * 1
    LostPoint = strLost * 0

    Points = WonPoint + DrawPoint + LostPoint
%>
<tr style="height:16px;">
  <td><%= rs("clubname") %></td>
  <td><%= rs("kTotal") %></td>
  <td style="width:20px;">V</td>
  <td style="width:20px;">U</td>
  <td style="width:20px;">T</td>
  <td><%= rs("mPTotal") %></td>
  <td><%= rs("mMtotal") %></td>
  <td><%= rs("pTotal") %></td>
</tr>
<%
rs.MoveNext
Loop
%>
</table>
<%
End if
%>



Den skal se sådan ud:
K V U T M+ M- P
FC Plicity 2 1 0 1 16 15 3
Real France 2 1 0 1 15 16 3

Det ser sådan ud:
K V U T M+ M- P
Real France 2 V U T 14 14 31
FC Plicity 2 V U T 14 14 31
Avatar billede fennec Nybegynder
02. september 2005 - 11:46 #74
Har du rettet din database???

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.
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