Brugerne opretter eller tildeles et hold, hvis ID også kommer ind i bruger-tabellen.
Nu vil jeg igang med at lave en komplet stilling, men stillingen skal sorteres efter DAGSGENNEMSNITTET. Dvs. at man skal tage de samlede indtastninger grupperet efter Hold (F.eks. har Hold 1 haft 72.000 skridt på dag 1, mens Hold 2 har haft 67.000 skridt).
Problemet opstår, når jeg skal lave en SQL Query, der i første omgang finder ud af, hvor mange brugere, der er på det enkelte hold, hvorefter det tal deles med de samlede indtastninger, som igen deles med antallet af dage, hvor konkurrencen har været i gang. Altså:
((Indtastninger i alt / Antal Deltagere) / Dage)
Resultatet af ovenstående formel skal så vises i en stilling med nr. 1 til xx med Desc. sortering.
SELECT b.navn "Hold navn", COUNT(a.brugernavn) "Bruger i gruppen", AVG(c.indtastning) "Skridt i gennemsnittet" FROM brugere a, hold b, indtastninger c WHERE c.dato="01-05-09" AND c.hold=b.id AND c.brugerid=a.id GROUP BY b.navn
Men syns nu din database er underligt sat op. Hvorfor er der et hold felt ved brugere? er der ingen brund til hvis der er sat ind under hold.
Jeg har ikke lige haft mulighed for at teste det, da det er på firmaets netværk, men jeg får det testet på mandag.
Grunden til, at Hold også ligger under brugere er fordi, tabellen Hold KUN indeholder en incremental ID, brugerID'et på personen, der er holdkaptajn for holdet samt holdnavnet. Den viser ikke, hvor mange mennesker, der er medlem af holdet. På den måde er der kun 1 linje pr. hold i den tabel, hvorimod der kan være op til 5 personer med samme Hold under Bruger-tabellen.
I princippet kunne jeg måske have undladt Hold i Indtastninger-tabellen, men tænkte at det kunne give en lettere SQL Query at have den med.
Nu får et svar på mandag, når jeg har prøvet koden af :) På forhånd tak for hjælpen
Nå, jeg fik da koden NÆSTEN til at fungere, og så skulle der ovenikøbet en masse tovtrækkeri til.
Jeg kom frem til følgende kode:
SELECT b.Holdnavn, b.ID, SUM(c.Indtastning) as SkridtIaltHold, (SUM(c.Indtastning) / $Dag) as Gennemsnit FROM skridt_brugere a, skridt_hold b, skridt_indtastninger c WHERE a.Hold=b.ID AND c.BrugerID=a.ID GROUP BY b.Holdnavn ORDER BY Gennemsnit DESC
$Dag er variablen for, hvor mange dage konkurrencen har strukket sig over. Det, jeg dog MANGLER i ovenstående kode er, at gennemsnittet skal findes ud fra antallet af deltagere på de respektive hold. F.eks. kan der godt være 5 deltagere på et hold, mens der kun er 3 på det andet. Der skal derfor en variabel mere ind i følgende:
(SUM(c.Indtastning) / $Dag) as Gennemsnit
Hvordan jeg lige finder ud af hvor mange deltagere, der er på holdet, ved jeg ikke hvordan jeg får lagt ind i den select-statement.
Jeg fandt antallet via følgende select:
SELECT count(Hold) as Antal FROM skridt_brugere where Hold = '$ID' GROUP BY Hold
$ID kom af b.ID fra den store select-statement. Men det dur ikke, da der så ikke bliver sorteret efter gennemsnittet. Hvordan får jeg gjort det hele i 1 select-statement?
Okay - næste opdatering i denne tråd kommer her. NU har jeg fået den til at gennemføre SQL-statementet, så den sorterer efter gennemsnit. Det gør jeg via følgende statement:
SELECT b.Holdnavn, b.ID, SUM(c.Indtastning) as SkridtIaltHold, (SUM(c.Indtastning) / $Dag / (SELECT count(a.Hold) as Antal FROM skridt_brugere a where a.Hold = b.ID GROUP BY a.Hold)) as Gennemsnit FROM skridt_brugere a, skridt_hold b, skridt_indtastninger c WHERE a.Hold=b.ID AND c.BrugerID=a.ID GROUP BY b.ID ORDER BY Gennemsnit DESC
Nu får jeg bare et andet problem!! Hvordan tweaker jeg ovenstående SQL-statement til også at indeholde alle hold i databasen - altså også dem der endnu ikke har indtastet noget i databasen? De skal jo også være en del af stillingen men bare med 0 i gennemsnittet.
Så fandt jeg endelig ud af problemet. Fik lavet en LEFT JOIN på den sidste select, jeg lavede, så den fik alle hold med i stillingen.
Men der kom jo desværre ikke flere svar, så jeg vil lukke spørgsmålet. Erle - hvis du vil have halvdelen af pointene, så læg et svar.
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.