[PHP/SQL] Hulp nodig bij logica
# Matches
- MatchID
- MatchHomeID
- MatchHomeScore
- MatchAwayID
- MatchAwayScore
# MatchesGoals
- GoalID
- GoalPlayer
- GoalMatch
- GoalMinute
Ik wil hiermee dus een tussenstand gaan maken zoals deze, maar dan niet voor de Eredivisie. Ik weet niet of 'MatchHomeScore' en 'MatchAwayScore' noodzakelijk zijn. Want het aantal goals, wedstrijden, winst, verlies, gelijk moet worden berekend en uiteindelijk het aantal punten per ploeg. Het wordt een hele klus maar ik loop nu vast.
Ik vraag om advies en hulp. Alvast bedankt!
Nadat je klaar bent met normaliseren van je datamodel, kan het in dit geval heel goed zijn dat je wilt gaan denormaliseren om de efficientie van je applicatie te bevorderen. Maar dat zou ik pas gaan doen als blijkt dat in de genormaliseerde opzet de queries niet meer efficient op te stellen zijn.
Misschien is het volgende een idee?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?PHP
# Query voor het ophalen van alle teams.
{
# Query voor het ophalen van de goals per team
# Query voor het ophalen van de rode kaarten per team
# Query voor het ophalen van de gele kaarten per team
# Query voor het ophalen van de wedstrijden per team
{
# Query voor het checken van het aantal verloren wedstrijden
# Query voor het checken van het aantal gelijke gespeelde wedstrijden
# Query voor het checken van het aantal gewonnen wedstrijden
}
}
?>
# Query voor het ophalen van alle teams.
{
# Query voor het ophalen van de goals per team
# Query voor het ophalen van de rode kaarten per team
# Query voor het ophalen van de gele kaarten per team
# Query voor het ophalen van de wedstrijden per team
{
# Query voor het checken van het aantal verloren wedstrijden
# Query voor het checken van het aantal gelijke gespeelde wedstrijden
# Query voor het checken van het aantal gewonnen wedstrijden
}
}
?>
Zie dit als een verduidelijking van mijn idee. Ik denk dat dit zo het beste kan doen? Want alles in één query stoppen lijkt me onmogelijk? Dan moet ik nog even ga kijken hoe ik uit de MatchesGoals tabel kan checken hoe vaak ze verloren, gelijk of gewonnen hebben.
Graag advies ;)
Gewijzigd op 17/05/2011 16:47:59 door PHP Scripter
Meerdere overzichten betekent sowieso al meerdere queries. Dan ga je per overzicht bekijken of je de informatie met 1 query naar boven kunt halen, iets dat in de meeste gevallen toch wel moet lukken.
Kortom, stap 1 is volgens mij het bedenken wat je de bezoeker nu precies voor overzichten wilt laten zien...
http://bit.ly/7U1e2p. Precies hetzelfde, alleen dan met mijn eigen gegevens. Een klassement dus.
Joren, het wordt inderdaad een compleet overzicht zoals je in mijn voorbeeld kon zien: Gewijzigd op 17/05/2011 17:04:16 door PHP Scripter
Ik zou gewoon beginnen, dan zie je vanzelf waar je vast loopt? Begin met het meest bassale, dus een overzicht met de teams. Breid die query vervolgens steeds verder uit.
Toevoeging op 17/05/2011 20:30:47:
Ik zit nu even te denken. Ik kan wel alle teams ophalen vanuit de database. Maar hoe kan ik dan later selecteren op het aantal punten en die bovenaan zetten en er dus een volgorde inkrijgen?
Dit zou je natuurlijk ook in PHP kunnen doen, maar in SQL moet het ook lukken!
Alvast bedankt!
Toevoeging op 18/05/2011 11:40:36:
Wat ik natuurlijk ook zou kunnen doen is via een PHP script het aantal punten berekenen per ploeg en die in de database gooien.
Even snel iets opgezet:
Code (php)
Gewijzigd op 18/05/2011 11:41:36 door PHP Scripter
Ik zal even wat googlen naar "sub queries" en "sql join".
Gewijzigd op 18/05/2011 14:17:52 door PHP Scripter
Even googlen naar voorbeeld queries kan overigens ook geen kwaad, je bent immers niet de eerste die hier naar op zoek is. Zie bijvoorbeeld: http://www.sqlservercentral.com/Forums/Topic215132-230-1.aspx#bm216112 of google eens verder op 'sql soccer standings'.
Toevoeging op 18/05/2011 17:45:43:
Als er ondertussen mensen zijn die zich geroepen voelen om mij op weg te helpen.. graag! Ik ga zelf ook nog prutsen met het een en ander.
# Matches
- matchID
- teamOneID
- teamTwoID
# Goals
- matchID
- teamID
# Team
- teamID
- teamName
Volgensmij moet je daar alle informatiebehoeften uit kunnen halen, maar ik kan het niet met 100% zekerheid zeggen.
Om wat voorbeelden te geven:
Eindstand voor de eerste wedstrijd:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT
COUNT(g.matchID) as goalAmount,
t.teamName
FROM Goals g
INNER JOIN Team t
ON g.teamID=t.teamID
WHERE
g.matchID = 1
GROUP BY t.teamName
COUNT(g.matchID) as goalAmount,
t.teamName
FROM Goals g
INNER JOIN Team t
ON g.teamID=t.teamID
WHERE
g.matchID = 1
GROUP BY t.teamName
Alle teams met hun aantal goals:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
SELECT
t.teamName,
COUNT(g.teamID) AS goalAmount
FROM Team t
INNER JOIN Goals g
ON t.teamID=g.teamID
GROUP BY t.teamName
t.teamName,
COUNT(g.teamID) AS goalAmount
FROM Team t
INNER JOIN Goals g
ON t.teamID=g.teamID
GROUP BY t.teamName
Om te kijken of een team gewonnen, verloren of gelijk gespeeld heeft kun je de vergelijking maken van het aantal goals wat ze gemaakt hebben.
Gewijzigd op 18/05/2011 18:52:24 door Erik van de Locht
Erik, ik heb de afgelopen twee dagen een klein beetje aandacht besteed om verder te komen met deze query, ik wou het even laten rusten, maar tevergeefs. Ik ga morgen ook nog eens stoeien en hopen op een uitkomst. Ik heb gespeeld met veel group's en join's. Als iemand zich geroepen voelt om eventueel ook een 'poging' te wagen; graag!
Gewijzigd op 24/05/2011 13:04:13 door PHP Scripter
- Voor elk homeID (alias: team), bereken de overwinningen (homeScore > awayScore), gelijke spelen (homeScore = awayScore) en nederlagen. Puntenaantal kan je berekenen door een berekening over bovenstaande uitkomsten.
- Doe dit vervolgens voor elk awayID (alias: team).
- Tel bovenstaande op, per team uiteraard (SUM + GROUP BY).
- Sorteer op punten, aantal overwinningen of wat dan ook.
- Klaar!
Voordeel is dat je ook gelijk de thuis- of uitbalans hebt als je stap 1 of 2 weg laat.
NB: ik ga er hier vanuit dat de goals per team in de wedstrijd-tabel staat, en dus niet verder genormaliseerd is.
# MatchesGoals
- GoalID (Goal id)
- GoalTeam (Team id)
- GoalPlayer (Speler id)
- GoalMatch (Wedstrijd id)
- GoalMinute (Goal minuut)
Dus hieruit moet worden uitgelezen hoeveel punten een team heeft. Oftewel de winst en verlies berekenen. Ik heb eerlijk gezegd geen idee of dat wel mogelijk is, op deze manier. Anders ga ik gewoon het aantal goals bij de wedstrijd opslaan, in de wedstrijd-tabel dus.
Alvast bedankt voor de hulp!
Bumpje.
Bumpje.