Reken met MySQL.... pfff wat is dat lastig
Theoretisch gezien hoef je enkel de informatie van de games op te slaan, omdat de rest te berekenen is, maar dat maakt e.e.a. wel complexer.
In zekere zin is de informatie van de sets al redundant, deze is immers afleidbaar.
Op eenzelfde manier zou je ook de informatie wie een match gewonnen heeft apart kunnen opslaan, je hoeft deze dan maar één keer te bepalen/berekenen in plaats van elke keer opnieuw als je dit gegeven nodig hebt.
Vervolgens kun je hiermee makkelijker verder rekenen, omdat je eerder al alle relevante tussen- en eindresultaten waarin je geinteresseerd bent hebt berekend en opgeslagen.
Ik denk dus dat als je meer "afleidbare" informatie redundant/tussentijds opslaat, de rest ook makkelijker wordt.
Zoals altijd: verdeel en heers.
Je zou dus bijvoorbeeld een kolom "winnaar" kunnen toevoegen aan de tabel "matches". Vraag jezelf gewoon af wat moeite kost om (achteraf) te berekenen, en sla dit gewoon apart op in een of andere kolom.
Gewijzigd op 17/10/2018 18:04:27 door Thomas van den Heuvel
Gewijzigd op 17/10/2018 18:41:35 door - Ariën -
Gewijzigd op 17/10/2018 19:16:36 door Thomas van den Heuvel
Een complete dump van je datamodel zou ook handig zijn.
Topic mag voor wat nu wel gesloten worden... het is uiteindelijk een pracht resultaat geworden. Alle lof naar Rob. hij dingen toegelicht, uitgelegd en geholpen als ik iets snapte (was/is best veel). Maar er zat wel een hele leercurve voor me.. en dat alleen al was de moeite waard. Ron thnx, man
De query is wel zo'n beetje geworden wat ik op 14/10/2018 22:25:58 al aangaf, alleen nog met een extra kolom "aantal gespeelde wedstrijden" en een join naar de "poules" tabel voor de poule letter.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
SELECT t.teamNaam,p.pouleLetter,(
SELECT count(*) FROM `schema`
WHERE schemaPouleId = t.teamPouleId
AND (schemaTeamA = t.teamNaam OR schemaTeamB = t.teamNaam)
AND (schemaUitslagA > 0 OR schemaUitslagB > 0) //anders is de wedstrijd nog niet gespeeld
) AS aantal,
ifnull((SELECT SUM(ifnull(schemaUitslagA,0)) FROM `schema` WHERE schemaPouleId = t.teamPouleId AND schemaTeamA = t.teamNaam),0) +
ifnull((SELECT SUM(ifnull(schemaUitslagB,0)) FROM `schema` WHERE schemaPouleId = t.teamPouleId AND schemaTeamB = t.teamNaam),0) AS score
FROM teams t
JOIN poules p ON p.pouleId = t.teamPouleId
" . $where . "
ORDER BY pouleLetter ASC, score DESC
SELECT count(*) FROM `schema`
WHERE schemaPouleId = t.teamPouleId
AND (schemaTeamA = t.teamNaam OR schemaTeamB = t.teamNaam)
AND (schemaUitslagA > 0 OR schemaUitslagB > 0) //anders is de wedstrijd nog niet gespeeld
) AS aantal,
ifnull((SELECT SUM(ifnull(schemaUitslagA,0)) FROM `schema` WHERE schemaPouleId = t.teamPouleId AND schemaTeamA = t.teamNaam),0) +
ifnull((SELECT SUM(ifnull(schemaUitslagB,0)) FROM `schema` WHERE schemaPouleId = t.teamPouleId AND schemaTeamB = t.teamNaam),0) AS score
FROM teams t
JOIN poules p ON p.pouleId = t.teamPouleId
" . $where . "
ORDER BY pouleLetter ASC, score DESC
De team <-> schema koppeling is nu nog (steeds) op teamNaam, maar dat moet "ooit" (v 2.0) het teamId worden. Uiteraard kan dit allemaal nog veel mooier worden ingedeeld (over meerdere sub-tabellen), waardoor je ook flexibeler bent qua aantal wedstrijden (bijvoorbeeld ook enkelspel), of aantal sets - maar voor nu werkt dit.
De totaal-uitslag wordt gewoon in PHP berekend als de set-uitslagen worden ingevoerd/opgeslagen, en dan direct in de bestaande "multi-kolom" schema tabel opgeslagen (vandaar ook dat opslaan in de $_POST, zodat de rest van de code gewoon bleef werken zoals deze al deed toen de uitslag nog met de hand in aparte invoervelden moest worden ingevoerd):
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$uitslagA = $uitslagB = 0;
foreach(['Hd','Dd','Mix1','Mix2'] as $game){
$setsA = $setsB = 0;
for($set = 1; $set <= 3; $set++){
if($_POST["schema-{$game}{$set}A"] > $_POST["schema-{$game}{$set}B"]) $setsA++;
elseif($_POST["schema-{$game}{$set}A"] < $_POST["schema-{$game}{$set}B"]) $setsB++;
}
$_POST["schema-Sets{$game}A"] = $setsA;
$_POST["schema-Sets{$game}B"] = $setsB;
if($setsA > $setsB) $uitslagA++;
else $uitslagB++;
//altijd ongelijk (bij 1-1 volgt een tie-break)
}
$_POST['schema-UitslagA'] = $uitslagA;
$_POST['schema-UitslagB'] = $uitslagB;
foreach(['Hd','Dd','Mix1','Mix2'] as $game){
$setsA = $setsB = 0;
for($set = 1; $set <= 3; $set++){
if($_POST["schema-{$game}{$set}A"] > $_POST["schema-{$game}{$set}B"]) $setsA++;
elseif($_POST["schema-{$game}{$set}A"] < $_POST["schema-{$game}{$set}B"]) $setsB++;
}
$_POST["schema-Sets{$game}A"] = $setsA;
$_POST["schema-Sets{$game}B"] = $setsB;
if($setsA > $setsB) $uitslagA++;
else $uitslagB++;
//altijd ongelijk (bij 1-1 volgt een tie-break)
}
$_POST['schema-UitslagA'] = $uitslagA;
$_POST['schema-UitslagB'] = $uitslagB;
Dirk Huizinga op 04/11/2018 09:22:38:
Topic mag voor wat nu wel gesloten worden...
Dankjewel. Het topic zal vanzelf wel omlaag zinken. :-)