standen berekenen
Ik moet uit de ingevulde uitslagen die ik op een DB heb staan de uitslagen gaan berekenen. De DB is als volgt:
id
naam
wedstrijd
datum
onderdeel
categorie
resultaat
plaats
punten
Wat moet ik eruit krijgen:
In eerste instantie de resultaten, want die moet ik eerst weergeven. Dus de resultaten per onderdeel.
Daarna wil ik de standen laten verschijnen en dan per deelnemer.
Ik heb het geprobeerd met GROUP BY, alleen dat gaat niet goed.
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$sql = mysql_query("SELECT * FROM Maandag WHERE categorie = '$cat' GROUP BY onderdeel ORDER BY plaats ASC");
en
$standsql = mysql_query("SELECT SUM(punten) AS totaal, naam FROM Maandag GROUP BY naam ORDER BY SUM(punten) ASC");
?>
$sql = mysql_query("SELECT * FROM Maandag WHERE categorie = '$cat' GROUP BY onderdeel ORDER BY plaats ASC");
en
$standsql = mysql_query("SELECT SUM(punten) AS totaal, naam FROM Maandag GROUP BY naam ORDER BY SUM(punten) ASC");
?>
Ik heb alleen geen flauw idee hoe het wel moet. Wie helpt me verder op weg???
Pagina staat op:
www.aacamsterdam.nl/index.php?pagina=39
maandag? Wil je hiermee zeggen dat er ook tabelnamen dinsdag, woensdag, etc. aanwezig zijn? In dat geval is het datamodel fout.
nee, het heet maandag, omdat het gaat om de pupillenwedstrijden die op elke zoveelste maandag van de maand gehouden worden.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$sql = "SELECT ...." // je query
$res = mysql_query($sql);
if($res)
{
$aantal_regels = mysql_num_rows($res) // we kijken hoeveel regels er zijn
if($aantal_regels > 0) // als het aantal regels groter is dan 0...
{
while($rij = mysql_fetch_array) // gebruiken we een while-lus
{
echo $rij['id']; // hiermee wordt de id weergegeven
echo $rij['naam']; // hiermee wordt de naam weergegeven
// etc. etc.
}
}else{
echo "Er zijn geen resultaten gevonden.";
}
}else{
echo "De query kon niet worden uitgevoerd.";
}
?>
$sql = "SELECT ...." // je query
$res = mysql_query($sql);
if($res)
{
$aantal_regels = mysql_num_rows($res) // we kijken hoeveel regels er zijn
if($aantal_regels > 0) // als het aantal regels groter is dan 0...
{
while($rij = mysql_fetch_array) // gebruiken we een while-lus
{
echo $rij['id']; // hiermee wordt de id weergegeven
echo $rij['naam']; // hiermee wordt de naam weergegeven
// etc. etc.
}
}else{
echo "Er zijn geen resultaten gevonden.";
}
}else{
echo "De query kon niet worden uitgevoerd.";
}
?>
En voor "per deelnemer" gebruik je toch gewoon een WHERE ?
Gewijzigd op 01/01/1970 01:00:00 door Jesper Diovo
Bijv. Je hebt de DB zoals in post 1:
Wat bij bij de resultaten moet komen:
plaats 1 naam onderdeel resultaat punten
etc.
plaats1 naam onderdeel2 resultaat punten
etc.
stand:
plaats naam totaalpunten
dat lukt alleen niet.
Björn schreef op 18.12.2006 16:48:
Vreemd.nee, het heet maandag, omdat het gaat om de pupillenwedstrijden die op elke zoveelste maandag van de maand gehouden worden.
Waarom dan niet de tabel 'wedstrijden' ? Dat lijkt mij een stuk logischer, dat geeft tenslotte aan wat voor soort data er in deze tabel is terug te vinden. Dat het dan toevallig gaat om pupillen en dat de wedstrijd op een maandag wordt gespeeld, dat zijn allemaal eigenschappen van de wedstrijd waar het om gaat.
Ik krijg het vermoeden dat er niet of nauwelijks is genormaliseerd. Dit kan grote nadelige gevolgen hebben voor het datamodel waardoor je flink in de problemen kunt komen. Ga je eens verdiepen in normalisatie en controleer of je wel op de goede weg zit.
het heet geen wedstrijden, omdat je (als je de site bekeken hebt) ook gewone wedstrijden hebt en een wedstrijdkalender daarvoor. Daar is de tabel wedstrijden voor aangemaakt. Qua normalisatie klopt het allemaal wel aardig:P
In beide gevallen zijn er dus 2 kolommen het resultaat van 1 andere kolom en deze horen daarom ook niet opgeslagen te worden in de database.
Vervolgens heb je de kolom naam. Uit de GROUP BY die je wilt gebruiken maak ik op dat 1 bepaalde naam meerdere keren voor kan komen in deze tabel. Ook dit klopt niet, want hiervoor zou je tevens een aparte tabel moeten hebben. En als je dit voor naam hebt, gok ik dat precies hetzelfde geldt voor onderdeel en categorie (als je hier al een andere tabel voor hebt, heb ik natuurlijk niets gezegd ;))...
Kortom, ik zou eerst eens gaan kijken naar het normaliseren van je datamodel.
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
Bijvoorbeeld:
Piet springt 3,50m ver en wordt daarmee 1e, ook stoot hij 8,50m kogel en daarmee wordt hij 3e.
Voor eerste krijg je bijv. 10 en v oor 3e krijg je 8 punten.
DB: Piet 1 18-12-2006 verspringen 3,50m 1e 10
Piet 1 18-12-2006 kogelstoten 8,50m 3e 8
Uiteindelijk haal je de totale punten van Piet eruit en ook van andere deelnemers. Daarop baseer je de plaats in de stand.
Ja een naam kan meerdere keren voorkomen, maar ik snap niet helemaal wat je daar verder mee bedoelt. Hoezo een andere tabel?
Stel nu dat je een aparte tabel 'punten' zou hebben die er als volgt uit ziet:
punten
--------
pid
onderdeel_id
plaats
punten
Aan de hand van de plaats waarop iemand geëindigd is bij een bepaald onderdeel, kun je nu direct al zien hoeveel punten iemand krijgt. Dit hoef je dus niet op te slaan in die andere tabel. Als je zelfs hetzelfde aantal punten krijgt voor ieder onderdeel, kun je dat gegeven er zelfs uitlaten. Kortom, de kolom punten hoort dan al niet meer thuis in je tabel 'Maandag'.
Wat betreft de naam: deze kan meerdere keren voorkomen, maar is wel uniek. Deze hoort derhalve dus in een aparte tabel. Als je dit niet doet loop je bijvoorbeeld tegen het probleem hebt als je de namen:
Peter
peter de V.
Peter de Vries
Is dit nu 1 en dezelfde persoon? Of zijn het 3 verschillende?
Ook hier heb je dus een aparte tabel met namen waarin je de gegevens van een bepaald persoon kunt opslaan. In je tabel 'Maandag' komt dan alleen nog het id van een bepaald persoon te staan.
Denken jullie dat wat ik wil ook mogelijk is bij de huidige DB of zou ik toch even naar het datamodel moeten kijken. Of is het wel mogelijk, maar toch beter om naar het datamodel ff aan te pakken??
Het mooie als je bijvoorbeeld een aparte tabel voor de deelnemers hebt, is dat je die gewoon uit een dropdown menutje kan laten selecteren. Hetzelfde geld voor de onderdelen en categorieën. Staat er een bepaalde deelnemer nog niet tussen? Dan heb jij alweer een mooi scriptje geschreven waarmee je er eentje kunt toevoegen.
Afgaande op het lijstje dat je in de openingspost gaf, kom je al snel op een aantal tabellen uit:
deelnemers
--------------
id
naam
leeftijd
etc.
wedstrijden
--------------
wid
naam
datum
categorieen
--------------
cid
omschrijving
onderdelen
-------------
oid
omschrijving
punten
---------
pid
onderdeel_id
positie
punten
resultaten
------------
rid
deelnemer_id
wedstrijd_id
categorie_id
onderdeel_id
resultaat
positie
Dit is maar een opzetje, en het valt natuurlijk nog verder uit te breiden ;-)
Björn schreef op 18.12.2006 17:08:
Dacht het niet!het heet geen wedstrijden, omdat je (als je de site bekeken hebt) ook gewone wedstrijden hebt en een wedstrijdkalender daarvoor. Daar is de tabel wedstrijden voor aangemaakt. Qua normalisatie klopt het allemaal wel aardig:P
Een wedstrijd is een wedstrijd. En of dit een gewone of een ongewone wedstrijd is, het blijft een wedstrijd. Dat er wat bijzonders met deze wedstrijd aan de hand is, dat is gewoon een eigenschap van deze wedstrijd. Net zoals dat de speeldatum en de uitslag eigenschappen van de wedstrijd zijn.
Kortom, je bent/was nog niet helemaal klaar met normaliseren.
Succes!
Echter, als ik het doe op jouw manier Blanche, dan zie ik helemaal door de bomen het bos niet meer.
Het probleem is, dat ik dus met veel verschillende dingen werk, en ik het dus op die manier met meerdere tabellen helemaal niet meer snap.
Want op deze manier weet ik eigenlijk al niet meer hoe ik het formulier ga maken om de resultaten in te voeren.
Het probleem zit m er dus in, dat er de volgende onderdelen zijn:
verspringen, hoogspringen, balwerpen, 40m, 60m, 600m, 1000m. Ze doen er echter maar 3 per wedstrijd en uiteindelijk doen ze 3 van die wedstrijden.
Ook is het aantal deelnemers steeds verschillend(het is op een trainingsavond en het hangt er maar vanaf hoeveel mensen er komen opdagen)
Hoe moet ik het nu dan oplossen? ik ben de weg momenteel compleet kwijt.
En dan als je die allemaal hebt, heb je een pagina nodig waar je resultaten kunt invullen. Op die pagina kun je met behulp van de tabellen deelnemers, wedstrijden, categorieen en onderdelen allemaal selectboxjes maken. Op die manier kan degene die de invoer doet een deelnemer selecteren, daarbij ook een wedstrijd, categorie en onderdeel selecteren en vervolgens het resultaat invullen.
Voor het uitlezen van de resultaten heb je weer een andere pagina nodig waarbij je met behulp van gegevens uit de tabellen een verschillende overzichten kunt creëren.
Alleen voor de resultaten invullen lukt het me nu niet. Die selectboxjes kan ik wel maken, maar het formulier moet er eigenlijk zo uitkomen te zien(althans zo zag het eruit):
input(naam) input(resultaat1) input(plaats1) input(resultaat2) input(plaats2) input(resultaat3) input(plaats3)
Dat was makkelijker voor de persoon die het ging invoeren. Ik maak het alleen wel even wat anders, dan gaat het invoeren wss wel lukken. Gewoon per onderdeel de resultaten invoeren.
Na het posten van het formulier kun je de array uitlezen met een foreach loop en de bijbehorende data naar de database schrijven...