[PHP/SQL] Hulp nodig bij logica
Ik heb momenteel de volgende tabellen die betrekking hebben tot dit onderwerp. Ik benoem alleen de tabellen/rijen die te maken hebben met dit 'probleem':
# 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!
# 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!
Gesponsorde koppelingen:
MatchHomeScore en MatchAwayScore zijn overbodig aangezien deze informatie af te leiden valt uit de MatchesGoals tabel. Je weet welke speler gescoord heeft (GoalPlayer) en tot welk team die player behoort (als het goed is)...
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.
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.
Joren, bedankt voor je reactie! Ik dacht inderdaad ookal dat die overbodig waren. Maar hoe kan ik nu het beste beginnen? Ik heb geen idee waar ik moet beginnen en hoe. Want volgens mij komen er veel uitgebreide query's aan te pas.
Misschien is het volgende een idee?
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 ;)
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
Je startpunt moet volgens mij gewoon de overzichten zijn die je wilt genereren. Het lijkt me sterk dat je alle informatie van alle teams in 1 overzicht wilt gooien?
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...
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...
Joren, het wordt inderdaad een compleet overzicht zoals je in mijn voorbeeld kon zien: http://bit.ly/7U1e2p. Precies hetzelfde, alleen dan met mijn eigen gegevens. Een klassement dus.
Gewijzigd op 17/05/2011 17:04:16 door PHP Scripter
Dan denk ik dat je zo wel op de goede weg zit. Ik vermoed dat je veel met 1 query uit de database kunt trekken, maar je zult er inderdaad meerdere nodig hebben. Eigenlijk gebruik je een nieuwe query zodra je een nieuwe vraag stelt aan de database. Dus bijvoorbeeld informatie over een andere groep data.
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.
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.
Joren, bedankt! Dan ga ik zo meteen gelijk aan de slag. Ik zal vanavond mijn vooruitgang posten.
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?
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?
Dan zul je dus in de query waarin je alle teams ophaalt, op zijn minst ook het aantal punten moeten berekenen en daarop moeten sorteren. Als gevolg daarvan haal je direct waarschijnlijk al andere interessante gegevens op.
Dit zou je natuurlijk ook in PHP kunnen doen, maar in SQL moet het ook lukken!
Dit zou je natuurlijk ook in PHP kunnen doen, maar in SQL moet het ook lukken!
Joren, hoe moet ik dat gaan doen dan? Dan zal ik dus het aantal Winst, Gelijk en Verlies ookal moeten berekenen in die query? Zal je mij misschien een stukje op weg kunnen helpen? Dus dan moet via MatchesGoals alle uitslagen worden berekend en daarop worden de punten gebaseerd.
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:
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
zo'n soort berekeningen zijn gewoon in sql op te lossen, beetje overbodig om het zo te doen.
Ik zal even wat googlen naar "sub queries" en "sql join".
Ik zal even wat googlen naar "sub queries" en "sql join".
Jaron T, bedankt voor je reactie. Het zou inderdaad mogelijk zijn door middel van een Sub query. Maar hoe kan ik dan het beste de goals van de tegenstander opslaan? Want alleen de goals van het eigen team staan in MatchesGoals en niet van de overige teams in de competitie. Want het is een site gebaseerd op 1 team. Wat ik wel kan doen is bijvoorbeeld 'GoalOpponent' toevoegen en daar een '1' of '0' inzetten als het goal van de tegenstander is. Ik zou het toch héél fijn vinden als iemand mij op gang zou kunnen helpen met de hierbij horende query. Want ik heb nog nooit gewerkt met een sub query, wel met joins.
Gewijzigd op 18/05/2011 14:17:52 door PHP Scripter
Je zult hoe dan ook de goals van de tegenstander ergens op moeten slaan, hoe wil je anders de uitslag van een wedstrijd bepalen?
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'.
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'.
Joren, ik heb nu de doelpunten van de tegenstander ook opgeslagen in 'GoalMatches' en via 'GoalOpponent' wordt er aangegeven of het goal van de tegenstander is (1 or 0).
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.
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.
Ik heb me een beetje ingelezen in je idee, ik kom een beetje op dit uit:
# 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:
Alle teams met hun aantal goals:
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.
# 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!
Inmiddels is het alweer één week geleden en ben nog geen 'steek' opgeschoten. Als iemand zou willen bijspringen? Anders denk ik dat ik het anders ga aanpakken.
Gewijzigd op 24/05/2011 13:04:13 door PHP Scripter
Dit is toch vrij simpele wiskunde? Een stappenplan:
- 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.
- 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.
Mark PHP, bedankt voor je reactie. Nee, de goals staan niet in de wedstrijden-tabel maar in een aparte tabel. Dit omdat we zo kunnen berekenen wie de topscoorder is en ook kunnen zien wie hoe vaak heeft gescoord. De goals worden als volgt opgeslagen:
# 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!
# 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.



