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:
Dit lijkt er heel sterk op dat je datamodel niet klopt! Als gevolg daarvan wordt het ook een stuk lastiger om de gegevens die jij wilt ophalen te verkrijgen.
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.
Blanche probeert het voorzichtig te brengen, dat is niet mijn sterkste kant: Jouw database deugt van geen kanten en kan bij het grofvuil worden gezet. Het is (vrijwel) onmogelijk om hier een goed systeem mee te maken.
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.
Het was lang geleden dat ik op deze site een vraag had gesteld.
Inmiddels weet ik weer waarom.
Vaarwel.....
Dat is jammer, men helpt je hier graag en zeker met goede oplossingen.
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.
Ik was eigenlijk niet meer van plan te reageren.
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.
Zoals ik al zei, het aanpassen van je datamodel is zeker de meest slimme oplossing...
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?
Gifo, er wordt niet met losse flodders geschoten, er wordt je gewoon vertelt hoe de vlag er bij hangt. Een tabel met genummerde kolomnamen is 999999 van de 1000000 keer een verkeerd opgezet. En die ene keer dat het wel goed is, moet ik nog tegenkomen. Je kunt het flauw vinden dat we jouw datamodel afkraken, ik vind het nog veel flauwer om iemand aan te laten klooien met een datamodel wat nog veel meer problemen gaat opleveren. Met het huidige datamodel kun je namelijk geen goede (lees: eenvoudige) queries maken.
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.
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:
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
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.
Met andere woorden, hoe vaak een bepaalde speler in 1 team voorkomt?
Tja, met deze opzet wordt dat toch echt lastig. Je zou de gegevens die je met die query ophaalt in een array kunnen zetten.
<?php
// $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.