Aantal spelers uit tabel
Ik zit met de volgende uitdaging.
Ik heb een database met onder andere 2 tabellen: teams en rondeteams. Elke week worden de teams uit de tabel teams weggeschreven naar rondeteams.
Elk team bestaat uit 12 spelers.
In de tabel rondeteams staan dus per week de spelernamen van elk team vermeld. Wat ik nu graag wil is een overzicht maken van welke namen in de afgelopen weken allemaal zijn geselecteerd. Dit komt dus uit de tabel rondeteams.
Om de gegevens te selecteren, heb ik de volgende query:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$sql = "SELECT speler1,speler2,speler3,speler4,speler5,speler6,speler7,speler8,speler9,speler10,speler11,speler12";
$sql .= "FROM rondeteams";
$sql .= "WHERE teamnaam='Testteam'";
?>
$sql = "SELECT speler1,speler2,speler3,speler4,speler5,speler6,speler7,speler8,speler9,speler10,speler11,speler12";
$sql .= "FROM rondeteams";
$sql .= "WHERE teamnaam='Testteam'";
?>
Uit bovenstaande gegevens wil ik dan dat van elke speler het aantal weergegeven wordt. Ik dacht zelf dit te doen met array_count_values().
Ik krijg het resultaat uit bovenstaande query echter niet in één array.
Kan iemand mij misschien verder op weg helpen?
In principe sla je gegevens maar 1x op in een database, dus elke spelernaam komt maar 1x voor. Maar het lijkt mij dat in de tabel rondeteams heel veel dubbele namen voorkomen. Dit zou je op een hele andere manier op moeten lossen. Als je dat doet, wordt het ook veel eenvoudiger om dat aantal dat je zoek te bepalen. Daarnaast weet je zodra je kolomnamen gaat nummeren ook al zeker dat je datamodel niet helemaal klopt. In een goed datamodel is dit namelijk niet nodig.
In een goed datamodel heb je allereerst natuurlijk een tabel met spelers nodig. Hierin sla je alle persoonlijke gegevens van de spelers op. Vervolgens zul je ook nog tabellen nodig hebben waarin je teams en rondes kunt opslaan. En waarschijnlijk zul je ook een aantal koppeltabellen nodig hebben om het geheel aan elkaar te koppelen.
Als ik jou was zou ik beginnen met het doorlezen van wat tutorials over normaliseren. Dit kan je in een later stadium namelijk grotere problemen besparen.
Kortom, weggooien die zooi en opnieuw beginnen. Begin eens met deze tutorial uit te werken en het normaliseren onder de knie te krijgen.
Mocht je MySQL als database gebruiken, ik raad het je af, gebruik dan in hemelsnaam wel de innoDB-engine, dat is de enige mogelijkheid om een echte database (RDBM) in MySQL op te zetten.
Inmiddels weet ik weer waarom.
Vaarwel.....
Gifo schreef op 12.08.2007 16:18:
Dat is jammer, men helpt je hier graag en zeker met goede oplossingen.Het was lang geleden dat ik op deze site een vraag had gesteld.
Inmiddels weet ik weer waarom.
Vaarwel.....
Inmiddels weet ik weer waarom.
Vaarwel.....
Aanmodderen met jouw huidige database is zonde van de tijd. Nu een goede database opzetten en daarmee aan de slag gaan, levert veel meer op.
En daar komt bij, wat is er mis met iets nieuws leren?
Edit: Jammer dat in jouw topic van 03.03.2006 13:09 niet is gezegd dat het datamodel niet deugt, nu ben je bijna anderhalf jaar verder en zit je nog steeds met deze ellende. En dat was helemaal niet nodig geweest.
Gewijzigd op 01/01/1970 01:00:00 door Frank -
Toch nog even kort een reactie.
Het gaat mij niet om dat ik niet open sta voor iets nieuws.
Maar ik stel een volgens mij toch normale vraag waar ik tegenaan loop, waarbij ik hoop dat er iemand is die mij kan helpen.
Vervolgens krijg ik alleen (erg makkelijke) kritiek op het datamodel.
Jullie hebben bij lange na niet alle informatie over het datamodel, dus om dit gelijk helemaal af te kraken vind ik erg flauw. Ik heb hier wel goed over nagedacht aan het begin en tot nu toe helemaal geen problemen mee gehad.
Nu wil ik er echter iets extra's mee doen en kom ik er niet uit hoe dat te doen.
Als blijkt dat ik hiervoor mijn datamodel moet aanpassen, dan ga ik hier zeker naar kijken.
Ik vind het gewoon jammer dat er meteen (met losse flodders) geschoten wordt voordat er verder gevraagd wordt. En om maar te zwijgen over een mogelijk antwoord op mijn vraag.
Het zal ongetwijfeld ook met een andere PHP manier opgelost kunnen worden, maar dat zou ik niet aanraden. Je loopt nu tegen dit, misschien relatief makkelijk op te lossen, probleem aan. Maar zeker is dat je met dit datamodel in de toekomst tegen veel grotere problemen aan kunt/zal lopen!
Verder snap ik je vraag ook nog niet helemaal, je wilt van elke speler een aantal. Maar welk aantal bedoel je dan?
Ik wil graag een overzicht van het aantal keer dat eenzelfde speler is gekozen door een bepaalde deelnemer in de verschillende rondes.
Je uitleg laat blijken dat iedere team automatisch in de tabelrondeteam gestopt wordt..
of heb ik dat verkeerd op ?
Dit heeft tot gevolg dat jij allerlei zaken die standaard in een database zitten, zelf nog eens kunt gaan nabouwen in PHP. Dit kost veel tijd om te bouwen, te testen en te debuggen en het uiteindelijke resultaat is een script dat ook nog eens een stuk langzamer is! Zit jij hierop te wachten? Ik zou er niet vrolijk van worden.
Het datamodel is gewoon niet goed, hierdoor wordt de boel onnodig ingewikkeld. Ik kan je dus niets anders aanraden dan een goed datamodel op te zetten en jouw scripts daarop aan te passen.
Quote:
Wat ik nu graag wil is een overzicht maken van welke namen in de afgelopen weken allemaal zijn geselecteerd.
Dit zal uit minimaal 2 tabellen moeten komen, de tabel 'spelers' en de tabel 'opstelling'. Tevens zal er in de tabel 'opstelling' een datumtijd-stempel moeten staan waarmee je eenvoudig het weeknummer kunt bepalen.
Voorbeeldje om de spelers van vorige week op te halen:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT
naam
FROM
spelers AS s
JOIN opstelling AS o ON s.id = o.id_speler
WHERE
WEEK(o.datum) = WEEK(NOW()) - 1
AND
YEAR(o.datum) = 2007
naam
FROM
spelers AS s
JOIN opstelling AS o ON s.id = o.id_speler
WHERE
WEEK(o.datum) = WEEK(NOW()) - 1
AND
YEAR(o.datum) = 2007
Maar goed, dit zul je moeten aanpassen aan het datamodel zoals jij dat opzet. Het idee van een tabel 'spelers' en 'opstelling' zal waarschijnlijk niet zo anders zijn.
Succes!
Tja, met deze opzet wordt dat toch echt lastig. Je zou de gegevens die je met die query ophaalt in een array kunnen zetten.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
// $result = mysql_query(...)
$gegevens = array();
while($row = mysql_fetch_assoc($result))
{
$gegevens[] = $row;
}
?>
// $result = mysql_query(...)
$gegevens = array();
while($row = mysql_fetch_assoc($result))
{
$gegevens[] = $row;
}
?>
Vervolgens zou je met een tweetal foreach loops de gegevens uit kunnen lezen en kunnen kijken hoe vaak 1 speler voorkomt. Het grote probleem hier is dat je die loop voor elke speler uit moet gaan voeren. Maar ja, hoe krijg je die lijst met spelers die je moet doorlopen?
Het zal er waarschijnlijk op neer komen dat je een complexe (recursieve) php functie moet gaan schrijven die de resultaten uit de database voor je interpreteert. Ik zou er persoonlijk niet aan beginnen.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
$sql = "SELECT speler1,speler2,speler3,speler4,speler5,speler6,speler7,speler8,speler9,speler10,speler11,speler12";
$sql .= "FROM rondeteams";
$sql .= "WHERE teamnaam='Testteam'";
$resultaat = mysql_query($sql);
$aantal_spelers = array();
while($row = mysql_fetch_array($resultaat))
{
array_unshift($aantal_spelers,
$row['speler1'],
$row['speler2'],
$row['speler3'],
$row['speler4'],
$row['speler5'],
$row['speler6'],
$row['speler7'],
$row['speler8'],
$row['speler9'],
$row['speler10'],
$row['speler11'],
$row['speler12']);
}
$tel_aantal = array_count_values($aantal_spelers);
?>
$sql = "SELECT speler1,speler2,speler3,speler4,speler5,speler6,speler7,speler8,speler9,speler10,speler11,speler12";
$sql .= "FROM rondeteams";
$sql .= "WHERE teamnaam='Testteam'";
$resultaat = mysql_query($sql);
$aantal_spelers = array();
while($row = mysql_fetch_array($resultaat))
{
array_unshift($aantal_spelers,
$row['speler1'],
$row['speler2'],
$row['speler3'],
$row['speler4'],
$row['speler5'],
$row['speler6'],
$row['speler7'],
$row['speler8'],
$row['speler9'],
$row['speler10'],
$row['speler11'],
$row['speler12']);
}
$tel_aantal = array_count_values($aantal_spelers);
?>
En hoe behandel je de verschillende versies van dezelfde naam: Jan, jan, JAN? Een spatie die per ongeluk in een naam staan zal ook een probleem opleveren, want 'Jan' is immers niet hetzelfde als ' Jan'.
Kortom, je zult of al die uitzonderingen af moeten vangen in je PHP script, of je zult je datamodel aan moeten gaan passen. Iets dat naar mijn mening nog steeds slimmer is...
De teams zijn namelijk gevormd vanuit een tabel 'spelers'. Elke naam is derhalve per definite uniek.
Eventuele uitzonderingen zjn al afgevangen bij het aanmaken van de teams zelf.
1) www.geefmesneleenoplossingdiewerktmaaktnietuithoe.nl
2) www.ikwilechtgoedlerenprogrammeren.nl
;-)
Jan jij weet nog hoe ik ben begonnen met Niets en dat ik door simpele vraagjes nu toch men site op poten heb gekregen hé ?
Ik heb er veel van geleerd :)
Neem er dus een voorbeeld aan
Er wordt hier een vraag gesteld. En gelijk wordt er met woorden gegooid als "deugt van geen kant", "zet maar bij het grofvuil", "aanklooien".
En dit terwijl er niet eens wordt gevraagd waarom voor een bepaalde opzet is gekozen.
Er staat veel nuttige info op deze site, maar als er op een dergelijke manier gereageerd wordt, gaan bij mij de nekharen overeind staan.
Ik zeg niet dat ik het allemaal op de beste en enig goede manier doe, maar er zijn nog altijd meerdere wegen die naar Rome leiden......
Absoluut. En het staat je vrij om elke weg te kiezen. En als je onderweg het even niet meer weet, kun je ook de weg vragen. En ook dat advies mag je aan je laars lappen. We leven tenslotte in een vrij land.
Maar begrijp je wat ik zeg over de manier waarop iets gebracht wordt?
Ik bedoel, als ik iets beter anders kan doen hoor ik het graag. Kritiek is nooit leuk, maar wel nuttig.
Maar je kan ook proberen op een normale manier te reageren.
Hoe er op mijn vraag gereageerd werd, vind ik niet normaal.
Maar wat mij interesseert: ben je nu op nieuwe ideeën gebracht? Denk je bij jezelf: ik moet toch eens wat over normalisatie gaan lezen? Of ben je blij met elke oplossing, als het maar werkt?
1) ik ben blij dat ik inmiddels een oplossing gevonden heb voor waar ik mee bezig ben.
2) Ik heb vanavond idd al het e.e.a. gelezen over normalisatie en ik ga bekijken of ik dit verder kan en ga toepassen in mijn huidige site.