login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Join hulp nodig

Offline Outerslam - 09/04/2008 00:10
Avatar van OuterslamNieuw lid Hallo,

Ik probeer een klassement te maken met een aantal gegevens.

Ik heb een tabel :
wedstrijdkalender met als Primary key = wedstrijdID waarbij ik kan sorteren op wedstrijdtypeID=2

wedstrijduitslagen waar ik wedstrijdID gebruik voor de wedstrijd dag , hier staan tevens ook de punten in vermeld en ook ID van de deelnemers
vissers met als Primary key visserID.

Nu is het zo dat er wekelijks mensen bijkomen om een wedstrijd mee te doen, sommige doen maar één wedstrijd en anderen doen ze allemaal.

Nu weet ik niet hoe ik het moet klaar krijgen om de gewenste gegevens te krijgen zodat ik per week alle ID's krijg van de deelnemers ,

Dus als iemand maar eenmalig mee doet mag hij voor de rest van de wedstrijden alleen 0 geven

Klein voorbeeldje

visser1 (dag1 =0) (dag2 =0) (dag3 = 22) (dag4 =0) (dag5 =3)
visser2 (dag1 =2) (dag2 =5) (dag3 = 13) (dag4 =6) (dag5 =1)
enz


hoe kan dit nu het beste gedaan worden want ik geraak er niet uit.

Ik weet dat ik een JOIN kan gebruiken maar left right inner of outer , ik krijg het niet klaar , ik hoop dat jullie me kunnen helpen .

dus
wedstrijduitslagen bevat:
UitslagID - visserID - wedstrijdID - gewicht

wedstrijdkalender bevat:
wedstrijdID - dag - weekdagID - maandID - hoeveelsteID -wedstrijdtypeID - legendeID - urenID

vissers bevat:
visserID - voornaam - achternaam

Alvast bedankt

6 antwoorden

Gesponsorde links
Offline Thomas - 09/04/2008 08:55
Avatar van Thomas Moderator Als er geen deelnemers zijn op een bepaalde dag, krijg je waarschijnlijk ook geen resultaten? Je zult in PHP dan ook het een en ander moeten fatsoeneren (lege dagen opvullen met "0"). Tenzij de wedstrijdkalender-tabel altijd voor alle dagen gevuld is?

Die id's in het voorbeeld, wat voor id's zijn dat? Wedstrijduitslagen-id's?

Zoals ik het zie kun je het beste een LEFT JOIN maken van wedstrijdkalender op wedstrijduitslagen, en dan in PHP de gegevens per visser ordenen.

  1. SELECT *
  2. FROM wedstrijdkalender wk
  3. LEFT JOIN wedstrijduitslagen wu ON (wu.wedstrijdID = wk.wedstrijdID)
  4. WHERE wk.dag >= [startdag]
  5. AND wk.dag <= [einddag]
  6. AND wk.maandID = [maand]


[startdag], [einddag] en [maand] zelf te bepalen / in te vullen, vervolgens resultaten per visser in een array zetten in PHP.
Offline Outerslam - 09/04/2008 22:09 (laatste wijziging 09/04/2008 22:11)
Avatar van Outerslam Nieuw lid de dagen spelen geen rol omdat ik het op jaarbasis moet hebben.
op uitslagID heb ik een primary key met auto increment gezet, echt nut heeft dit niet.

Het probleem is dat ik zoiets als dit heb

visser1 (dag1 =0) (dag2 =0) (dag3 = 22) (dag4 =0) (dag5 =3)
visser2 (dag1 =2) (dag5 =1)

maar ik zou iets moeten hebben als dit

visser1 (dag1 =0) (dag2 =0) (dag3 = 22) (dag4 =0) (dag5 =3)
visser2 (dag1 =2) (dag2 =0) (dag3 = 0) (dag4 =0) (dag5 =1)

Ook als die persoon een aantal wedstrijden niet mee doet moet ik daar resultaat van kunnen tonen in de vorm van 0 dan.

dus dat zou ik dan met php moeten doen ?
misschien dan met het aantal wedstrijden die reeds geweest zijn ofzo? of heb je een ander voorstel. 
Offline Berten - 10/04/2008 10:26 (laatste wijziging 10/04/2008 10:30)
Avatar van Berten PHP beginner Ik denk wel dat het mogelijk moet zijn 

Als eerste heb ik een tabel 'spelers' gemaakt met alle spelers er in, vanuit deze tabel starten we onze query.

Voor alle spelers, gaan we dan alle wedstrijduitslagen ophalen met een LEFT join (enkel alle uitslagen waarvoor de spelerID gelijk is aan de spelerID van de speler waarvoor we lezen).

Voor alle uitslagen gaan we met een RIGHT join wedstrijdkalenders lezen, als resultaat krijgen we hier alle wedstrijddagen (niet enkel degene die de speler heeft gespeeld)

Als structuur heb ik dus het volgende

  1. --
  2. -- Tabel structuur voor tabel `spelers`
  3. --
  4.  
  5. CREATE TABLE `spelers` (
  6. `spelerID` tinyint(3) NOT NULL DEFAULT '0',
  7. `spelerNAAM` varchar(255) NOT NULL DEFAULT '',
  8. PRIMARY KEY (`spelerID`)
  9. ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
  10.  
  11. --
  12. -- Tabel structuur voor tabel `wedstrijdkalender`
  13. --
  14.  
  15. CREATE TABLE `wedstrijdkalender` (
  16. `wedstrijdID` tinyint(3) NOT NULL AUTO_INCREMENT,
  17. `wedstrijdtypeID` char(2) NOT NULL DEFAULT '',
  18. PRIMARY KEY (`wedstrijdID`)
  19. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;
  20.  
  21.  
  22.  
  23. --
  24. -- Tabel structuur voor tabel `wedstrijduitslage`
  25. --
  26.  
  27. CREATE TABLE `wedstrijduitslage` (
  28. `uitslagID` tinyint(3) NOT NULL AUTO_INCREMENT,
  29. `wedstrijdID` tinyint(3) NOT NULL DEFAULT '0',
  30. `punten` tinyint(3) NOT NULL DEFAULT '0',
  31. `spelerID` tinyint(3) NOT NULL DEFAULT '0',
  32. PRIMARY KEY (`uitslagID`)
  33. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;


Verder heb ik wat gaten gelaten in de gespeelde wedstrijden, en de volgende sql code geeft denk ik de correcte resultaten weer.
  1. SELECT DISTINCT wk.wedstrijdID,IFNULL(wu.punten,0) punten,s.spelerID,s.spelerNAAM FROM
  2. spelers s
  3. LEFT JOIN wedstrijduitslage wu ON (wu.spelerID = s.spelerID)
  4. RIGHT JOIN wedstrijdkalender wk ON (wu.wedstrijdID = wk.wedstrijdID)
  5. ORDER BY s.spelerID


De extra informatie zoals dag, etc kan je zelf wel toevoegen denk'k, dit zal iig de juiste resultaten geven 
Offline Outerslam - 10/04/2008 23:17 (laatste wijziging 13/04/2008 14:44)
Avatar van Outerslam Nieuw lid Hey bedankt voor jullie reactie's

hhm , ik denk dat ik het een beetje begrijp maar dan moet ik ook de niet deelnemende vissers in de tabel wedstrijduitslagen hebben staan voor elke wedstrijd, of zie ik het verkeerd. 
ik krijg nu alleen nulvelden op de wedstrijden die nog niet geweest zijn wat ook goed is maar mijn probleem is daarmee niet van de baan  
Maar dankzij dit ben ik al een stapje verder denk ik.

Ik heb dit ervan gemaakt zodat het met mijn database werkt 
  1. SELECT DISTINCT wk.wedstrijdID,IFNULL(wu.plaats,0) plaats,s.visserID,s.voornaam
  2. FROM vissers s
  3. LEFT JOIN wedstrijduitslagen wu ON (wu.visserID = s.visserID)
  4. RIGHT JOIN wedstrijdkalender wk ON (wu.wedstrijdID = wk.wedstrijdID)
  5.  
  6. ORDER BY s.visserID





Ik heb het nog wat aangepast maar het lukt me niet echt  

De namen + plaatsen komen meermaals voor , dus als bv één persoon 7 keer heeft meegedaan staan er 7 rijen met daar telkens de plaats.

De bedoeling is dat de persoon er één keer op staat met daarachter de behaalde plaatsen,

Kan er eens iemand naar kijken aub wat er niet goed is ?
hier is een voorbeeld wat het probleem is.

http://www.riet...avond_klas

Alvast bedankt.
  1. $wedtype = 2; // wedstrijdtype opgeven -> 2 = vrije wedstrijden!
  2.  
  3. //
  4. $main .="<hr />";
  5.  
  6.  
  7. $main .="<table width=\"750\" border=\"1\" cellspacing=\"0\" cellpadding=\"0\">
  8. <tr>
  9. <th scope=\"col\">Naam &amp; voornaam</th>\n";
  10. $sql1 = mysql_query ("SELECT * FROM wedstrijdkalender WHERE wedstrijdtypeID = ".$wedtype." GROUP BY hoeveelsteID ASC" ) or die (mysql_error());
  11. while ($dag = mysql_fetch_assoc($sql1)){// het aantal wedstrijden ophalen
  12. $main .="<th scope=\"col\"><a href=\"http://www.rietvissers.be/hengelsport/index.php?action=".$dag['maandID']."&dag=".$dag['dag']."\">".$dag['hoeveelsteID']."&eacute;</a></th>\n"; }
  13.  
  14. $main .="<th scope=\"col\">Totaal</th>\n </tr>\n
  15. ";
  16.  
  17.  
  18.  
  19. $sqlid =mysql_query ("SELECT *
  20. FROM vissers s
  21. LEFT JOIN wedstrijduitslagen wu ON (wu.visserID = s.visserID)
  22. RIGHT JOIN wedstrijdkalender wk ON (wu.wedstrijdID = wk.wedstrijdID)
  23. WHERE wk.wedstrijdtypeID = 2
  24. ORDER BY s.visserID, wk.wedstrijdID
  25. ") or die(mysql_error());
  26.  
  27.  
  28.  
  29. while ($visID = mysql_fetch_array ($sqlid)) {
  30. $main .="<tr>";
  31. $main .="<td>".$visID["achternaam"]."&nbsp;".$visID["voornaam"]."| ".$visID["hoeveelsteID"]."</td>";
  32.  
  33. $kalender = mysql_query ("SELECT wedstrijdID FROM wedstrijdkalender WHERE wedstrijdtypeID = ".$wedtype." ") or die (mysql_error());
  34.  
  35. while($wedid = mysql_fetch_array($kalender)){
  36. $main .="<td";
  37.  
  38. if ($visID["wedstrijdID"] == $wedid["wedstrijdID"] ){
  39.  
  40. $main .="><strong>".$visID['plaats']." </strong>";
  41. }
  42.  
  43. else {
  44. $main .=" class=\"error\">0";
  45. }
  46.  
  47.  
  48. }
  49. $main .="</td>\n</tr>\n";
  50.  
  51.  
  52. }
  53.  
  54. $main .="
  55. </table>";
Offline Berten - 14/04/2008 10:17
Avatar van Berten PHP beginner Je gaat voor elke wedstrijddag inderdaad 1 record selecteren, ik vrees dat het anders niet gaat lukken, in principe zou je dus. Aantal "wedstrijddagen * aantal vissers" records moeten krijgen.

doordat je ordent op visserID zou't moeten volstaan om door je resultaten te lopen en zo gou je visserID verandert even de TR af te sluiten.
Offline Outerslam - 19/04/2008 22:56 (laatste wijziging 19/04/2008 22:57)
Avatar van Outerslam Nieuw lid hey , bedankt voor je bericht  

Ik heb het eens geprobeerd met visserID maar volgens mij doe ik het verkeerd want er veranderd niets omdat de visserID altijd gevuld is en true retourneerd. is het misschien mogelijk om eens een voorbeeldje te geven aub want ik zit bijna in de knoop nu  
waarschijnlijk zal het simpeler zijn dan wat ik denk maar ja, al doende leert men 
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.28s