[PHP/SQL] Hulp nodig bij logica

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

PHP Scripter

PHP Scripter

17/05/2011 13:40:04
Quote Anchor link
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!
 
PHP hulp

PHP hulp

26/04/2024 17:11:41
 
Joren de Wit

Joren de Wit

17/05/2011 15:45:37
Quote Anchor link
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.
 
PHP Scripter

PHP Scripter

17/05/2011 16:47:27
Quote Anchor link
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?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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

  }
}

?>


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
 
Joren de Wit

Joren de Wit

17/05/2011 16:56:26
Quote Anchor link
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...
 
PHP Scripter

PHP Scripter

17/05/2011 17:03:53
Quote Anchor link
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
 
Joren de Wit

Joren de Wit

17/05/2011 17:33:40
Quote Anchor link
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.
 
PHP Scripter

PHP Scripter

17/05/2011 18:38:42
Quote Anchor link
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?
 
Joren de Wit

Joren de Wit

18/05/2011 08:56:10
Quote Anchor link
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!
 
PHP Scripter

PHP Scripter

18/05/2011 11:23:31
Quote Anchor link
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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
if ($HomeScore > $AwayScore)
{

    // Thuisploeg krijgt 3 punten toegekent
}
if ($HomeScore < $AwayScore)
{

    // Uitploeg krijgt 3 punten toegekent
}
if ($HomeScore == $AwayScore)
{

    // Beide ploegen krijgen 1 punt toegekent
}
?>
Gewijzigd op 18/05/2011 11:41:36 door PHP Scripter
 
Jaron T

Jaron T

18/05/2011 12:29:09
Quote Anchor link
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".
 
PHP Scripter

PHP Scripter

18/05/2011 14:17:03
Quote Anchor link
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
 
Joren de Wit

Joren de Wit

18/05/2011 14:23:35
Quote Anchor link
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'.
 
PHP Scripter

PHP Scripter

18/05/2011 14:44:04
Quote Anchor link
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.
 
Erik van de Locht

Erik van de Locht

18/05/2011 18:48:01
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


Alle teams met hun aantal goals:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


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
 
PHP Scripter

PHP Scripter

20/05/2011 23:31:45
Quote Anchor link
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!
 
PHP Scripter

PHP Scripter

24/05/2011 13:03:52
Quote Anchor link
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
 
Mark PHP

Mark PHP

24/05/2011 13:35:51
Quote Anchor link
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.
 
PHP Scripter

PHP Scripter

25/05/2011 12:15:42
Quote Anchor link
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!
 
PHP Scripter

PHP Scripter

26/05/2011 17:40:12
Quote Anchor link
Bumpje.
 
PHP Scripter

PHP Scripter

28/05/2011 19:29:55
Quote Anchor link
Bumpje.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.