Avatar billede lumbye Nybegynder
07. oktober 2003 - 14:13 Der er 12 kommentarer

Group by, Order by og limit i ét hug

Har en tabel der indeholder x records med "brudstykker" af resultater fra sportsbegivenheder.

Data ligger i mySQL-database og kodning sker i ASP. Tabellen er rimelig simpel og indeholder sådan set blot følgende:

Et eksempel på et record-sæt kunne være:
ID    LigaID    KampID    HoldID    Holdnavn ResType  Res
32    52        224        642        Holbæk        1      1
33    52        224        642        Holbæk        X      0
34    52        224        642        Holbæk        2      0
35    52        224        642        Holbæk        MF      4
36    52        224        642        Holbæk        MI      2
37    52        224        644        Korsør        1      0
38    52        224        644        Korsør        X      0
39    52        224        644        Korsør        2      1
40    52        224        644        Korsør        MF      2
41    52        224        644        Korsør        MI      4

Ovenstående fortæller at Holbæk-Korsør endte 4-2 (MF og MI). En masse lignende data findes for andre KampID'er og hold, og samlet set indeholder tabellen oplysninger nok til at kunne bygge en samlet stilling - dette er allerede gjort via en SQL-sætning som nedenstående hvor sorteringen sker "on the fly"

SQL = "SELECT Holdnavn, HoldID, " & _
"sum(case when ResType = ('1') AND result = ('1') then 1 else 0 end) as wins, " & _
"sum(case when ResType = ('X') AND result = ('1') then 1 else 0 end) as draws, " & _
"sum(case when ResType = ('2') AND result = ('1') then 1 else 0 end) as defeats, " & _
"sum(case when ResType = ('1') AND result = ('1') then 3 when ResType = ('X') AND result = ('1') then 1 else 0 end) as points, " & _
"sum(case when ResType = ('MF') then result else 0 end) as goalsfor, " & _
"sum(case when ResType = ('MI') then result else 0 end) as goalsagainst, " & _
"(sum(case when ResType = ('MF') then result else 0 end) - sum(case when ResType = ('MI') then result else 0 end)) as goaldiff " & _
"FROM resultater WHERE LigaID = 52 " & _
"GROUP BY HoldID " & _
"ORDER BY points DESC, goaldiff DESC, goalsfor DESC"

som udskriver a la

        K    V    U    T    MÅL    P
1. Holbæk     9    6    3    0    19-5    21
2. Sorø     9    5    2    2    12-9    17
3. Korsør     9    5    1    3    14-12    16
osv...

Så langt så godt...

Nu ligger problemet i at jeg ikke kan lave afgrænsede udtræk fra tabellen og bygge en "form"-tabel hvor der udtrækkes f.eks. de 6 seneste kampe for alle hold i ligaen.

Mit problem ligger i at jeg ikke kan få sat den "limit" på 6 kampe som ønskes - sættes LIMIT 6 i enden af ovenstående SQL, sker der bare det at den kun udvælger 6 hold, hvilket sikkert skyldes at der GROUP'es på HoldID, og at det er den laves LIMIT på.

Så vidt jeg kan formulere det med ord, så skal der ske følgende:

Der skal udvælges de seneste 6 (DISTINCT'e ?) KampID'er på hvert HoldID og så skal der foretages summeringer og sortering on the fly i stil med den allerede eksisterende SQL-sætning.

Altså både GROUP BY, ORDER BY og LIMIT (og måske DISTINCT) i samme sætning. Py-ha... Anyone?
Avatar billede jaw Nybegynder
07. oktober 2003 - 14:49 #1
"select * FROM tabel ORDER BY points DESC, goaldiff DESC, goalsfor DESC limit 6"

Det duer ikke?
Avatar billede jaw Nybegynder
07. oktober 2003 - 14:52 #2
Hov skulle måske lige læse ordentligt først :)
Selvf. ikke * når det ikke er alle felter du vil have, men hvad med det her?
SQL = ("SELECT Holdnavn, HoldID, " & _
"sum(case when ResType = ('1') AND result = ('1') then 1 else 0 end) as wins, " & _
"sum(case when ResType = ('X') AND result = ('1') then 1 else 0 end) as draws, " & _
"sum(case when ResType = ('2') AND result = ('1') then 1 else 0 end) as defeats, " & _
"sum(case when ResType = ('1') AND result = ('1') then 3 when ResType = ('X') AND result = ('1') then 1 else 0 end) as points, " & _
"sum(case when ResType = ('MF') then result else 0 end) as goalsfor, " & _
"sum(case when ResType = ('MI') then result else 0 end) as goalsagainst, " & _
"(sum(case when ResType = ('MF') then result else 0 end) - sum(case when ResType = ('MI') then result else 0 end)) as goaldiff " & _
"FROM resultater WHERE LigaID = 52 " & _
"GROUP BY HoldID " & _
"ORDER BY points DESC, goaldiff DESC, goalsfor DESC limit 6")
Avatar billede lumbye Nybegynder
07. oktober 2003 - 14:59 #3
Som jeg skrev, så har jeg prøvet at sætte limit på. Og så "limiterer" den blot antallet af hold til 6, fremfor at limitere udvalget af kampe for det enkelte hold...
Avatar billede angak Nybegynder
07. oktober 2003 - 15:44 #4
Hvad hvis du tilføjer KampID mellem SELECT og Holdnavn, altså

SELECT KampID, Holdnavn ....... osv ...... LIMIT 6
Avatar billede lumbye Nybegynder
07. oktober 2003 - 21:34 #5
Den fungede heller ikke... :-(
Avatar billede angak Nybegynder
08. oktober 2003 - 09:46 #6
Jeg må desværre give op... Kan ikke helt overskue det...
Avatar billede jaw Nybegynder
08. oktober 2003 - 14:04 #7
Ohh... Nu forstår jeg hvad du mener... Er det sådan så du evt. kunne sende et dump af din tabel så man kunne prøve det i praksis... Ellers er det for svært at overskue for mig i hvert fald...

Ellers så good luck med det...
Avatar billede angak Nybegynder
09. oktober 2003 - 14:04 #8
Det ville nu hjælpe ret meget hvis vi lige fik et dump af din tabel...
Avatar billede lumbye Nybegynder
09. oktober 2003 - 14:34 #9
Jeg ved ikke hvor interesseret du er i at få en tabel med over 150.000 records - ovenstående er en simplificering af tabellen, men burde være tilstrækkeligt. Sig til hvis du vil have den alligevel...
Avatar billede jaw Nybegynder
09. oktober 2003 - 14:56 #10
Det behøver ikke være med 150.000 records, men bare en 20-30 stykker, så det er til at teste i praktsis...
Avatar billede jaw Nybegynder
09. oktober 2003 - 14:57 #11
Og rent faktisk kan jeg egentlig godt se det tossede i at, mig og angak har sværet med 1 døgn og 5 seks. mellemrum :)
Avatar billede angak Nybegynder
09. oktober 2003 - 15:50 #12
Evt. bare et dump uden data.. Altså bare tabel-strukturen
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