Avatar billede jakoblerche Nybegynder
24. maj 2012 - 12:53 Der er 6 kommentarer og
1 løsning

Statistik fra MySQL database

Jeg er ikke helt sikker på hvordan jeg skal forklare dette spørgsmål men forsøger alligevel.

Jeg er igang med at lave en side der holder styr på min virksomheds kampe i bordfodbold. Den er rimelig simpel og databasen består af en enkelt tabel kaldet "games".

Tabellen indeholder seks værdier;

|id|date|red_team|blue_team|red_score|blue_score|

I red_team/blue_team er holdene defineret på følgende måde feks. "Poul;Anders".

Det jeg gerne vil lave nu er en måde at udtrække f.eks. den som har deltaget i flest kampe på. dvs gennemgå alle rækkerne og finde ud af hvem af de ti spillerede som deltager der er nævnt flest gange i både enten red_team og blue_team
Avatar billede montago Praktikant
24. maj 2012 - 13:15 #1
først en kommentar... dit database/tabel-design er elendigt!

for at man kan bruge en database til noget brugbart, skal den designes i 3. normal-orden (eller så tæt på som muligt)

du kan google "3. normal orden"

i princippet går det ud på at data kun må stå 1 gang i databasen og alt skal refereres med nøgler:

tabel: players
[id][navn]
[1][Poul]
[2][Anders]
[3][henning]
[4][troels]

tabel: teams
[id][TeamName]
[1][Red Team]
[2][Blue Team]

tabel: games
[rowid][GameID][teamid][playerid]
[1][1][1][1]
[2][1][1][2]
[3][1][2][3]
[4][1][2][4]

tabel: gamescore
[id][GameID][ScoreWinner][ScoreLoser][WinningTeamID]
[1][1][15][10][1]

osv osv...

Derved kan har du et design som opfylder 3. normal orden, som er nemt at trække statistik ud af.

--------

når du så endelgi skal trække stats ud, vil du have glæde af operatoreren 'GROUP BY':

(beklager det her er TSQL og ikke MYSQL)

SELECT TOP 3 COUNT(*), P.PlayerName
FROM [Games] G
JOIN [Players] P ON P.PlayerID = G.PlayerID
GROUP BY [PlayerID]
ORDER BY Count(*) DESC
Avatar billede jakoblerche Nybegynder
24. maj 2012 - 13:53 #2
Tak for svaret og jeg forstår godt hvad du mener.

Mit problem er at det ikke drejer sig om fast definerede hold. Når vi spiller er der altid to hold (red og blue), hvem der er på holdene skifter så fra gang til gang. Jeg kunne god definere det ligesom du skriver men jeg skal vel ikke have en tabel til teams når de stort set aldrig er ens?
Avatar billede montago Praktikant
24. maj 2012 - 14:05 #3
Hvis du ved at der altid er 2 spillere pr hold kan du evt lave gametabellen lidt om:

[gameid][blueplayer1][blueplayer2][replayer1][redplayer2]
[1][1][2][3][4]
[2][2][3][4][1]
[3][3][4][1][2]
[4][4][1][2][3]

så bliver designet stadig bedre end det første. og du vil kunne lave en okay group by (dog mere komplex)
Avatar billede montago Praktikant
24. maj 2012 - 14:08 #4
men i mit første inlæg er det muligt at spillere kan skifte hold allgievel...

gametabellen fortæller jo hvem der er på hold sammen i det pågældende spil
Avatar billede montago Praktikant
24. maj 2012 - 14:09 #5
Se bort fra #3 det var en hjerneblødning

mit oprindelige svar giver dig den bedste database
Avatar billede jakoblerche Nybegynder
24. maj 2012 - 14:38 #6
Ahh ok nu læste jeg denb rigtigt, så er der en entry for her enkelt spiller i hver kamp, den entry definerer så hvilken kamp det er, samt hvilket hold han/hun er på.

Virker lidt besværligt i mit hoved men kan godt se at det ville give mening.

Når jeg så skal hive data ud skal jeg bare definere hvilken kamp det drejer sig om (GameID) så finde alle de entries der passer med det Id ikke?

Der bliver da en forfærdelig masse joins når jeg skal finde frem til f.eks. hvilken spiller har været på flest vindende hold
Avatar billede montago Praktikant
24. maj 2012 - 17:44 #7
Det er derfor man skriver sine programmer i C# med LINQ ;)
(eller ethvert andet sprog med LINQ)

du skal jo maks lave 2-3 joins for at få de info du snakker om, det jo peanuts...
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

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