login  Naam:   Wachtwoord: 
Registreer je!
 Forum

selecteren met uitgebreide datum treeks

Offline markla - 16/12/2013 20:21
Avatar van marklaPHP interesse Even kijken of ik mijn probleemstelling duidelijk kan uitleggen zodat ik kan vragen of iemand me kan helpen met het benodigde script /methode om mijn doel te bereiken

Ik heb 3 tabellen
1) wedstrijd (iedere wedstrijd heeft 1 speeldatum)
2) dienstverbanden (iedere dienstverband heeft 1 start- en 1 einddatum (deze kan bij de huidige trainer leeg zijn)
3) trainers (iedere trainer kan meerder dienstverband (iedere trainer heeft minimaal 1 maar mogelijk meerdere -niet pers se aaneengesloten dienstverbanden)

nu wil ik op basis van het dienstverband bepalen welke trainer was tijdens welke wedstrijden

met dit kan ik één datum reeks selecteren
  1. WHERE
  2. (g.Game_DateTime >= '2011-07-01'
  3. AND
  4. g.Game_DateTime <= '2013-12-15')


en met dit kan ik meerdere datum reeksen selecteren

  1. WHERE
  2. (
  3. (g.Game_DateTime >= '2011-07-01'
  4. AND
  5. g.Game_DateTime <= '2013-12-15')
  6. OR
  7. (g.Game_DateTime >= '2009-08-01'
  8. AND
  9. g.Game_DateTime <= '2010-09-20')
  10. )


Maar hoe kan ik bepalen wat (zeg maar) datumreeks één en datumreeks twee en eventueel drie of meer is.

6 antwoorden

Gesponsorde links
Offline vinTage - 16/12/2013 20:31
Avatar van vinTage Nieuw lid Als ik je vraag goed begrijp, dan kun je gewoon BETWEEN gebruiken, dan gebruik je de start en einddatum en alles wat daartussen zit wordt 'gevonden'.
Offline Thomas - 16/12/2013 20:45
Avatar van Thomas Moderator Lijkt me lastig om dit rechtstreeks in MySQL te doen? Als ik je verhaal goed begrijp is een (één) dienstverband je uitgangspunt? Hangt er ook van af hoe je je informatie wilt presenteren. Ik neem aan dat je PHP gebruikt in combinatie met MySQL? Wat voor informatie-pagina's wil je bouwen (er van uitgaande dat je deze in HTML wilt weergeven)?

Het is niet verboden om in meerdere stappen -d.w.z. meerdere queries- je doel te bereiken, je zou dus, gegeven dienstverband X, achtereenvolgens kunnen bepalen:
- welke trainers er toen een dienstverband hadden, en
- welke wedstrijden er in deze perioden gespeeld zijn

Of is je uitgangspunt trainer Y:
- welke dienstverbanden heeft deze trainer
- welke wedstrijden zijn gespeeld in die perioden

Wat handig kan zijn is het bouwen van eenvoudige data-structuren in PHP, bijvoorbeeld in de vorm van arrays. Je kunt dan het "sorteerwerk" (welke wedstrijd hoort in welke periode (=dienstverband)) verplaatsen naar PHP. Je hoeft niet per se alles op te lossen / te berekenen in MySQL.

Het helpt enorm als je in je database al de goede beslissingen hebt genomen over de vorm waarin je data opslaat. Het datum-formaat wat je hebt gebruikt (yyyy-mm-dd) leent zich prima om in PHP mee te rekenen (yyyy-mm-dd is een alfabetische sortering zaken als ten minste en ten hoogste indien je vergelijkt met een enkele datum snijden in dat geval hout).

Je zou bijvoorbeeld een datastructuur kunnen bouwen waarbij je een wedstrijd-id opslaat in het goede sub-array van dienstverbanden (= je datastructuur). Op die manier kun je dus je wedstrijden in PHP sorteren per periode/dienstverband. Als je je datastructuur een beetje slim opbouwt, kun je daarna met simpele for/while loops de gewenste informatie afdrukken (als dat je uiteindelijke doel is).
Offline markla - 16/12/2013 20:57
Avatar van markla PHP interesse @vinTage
ja klopt maar er zijn meerdere niet aaneengesloten reeksen.

@FangorN
In basis wil ik een overzicht (grafiek) maken met hoeveel wedstrijden er in de periode(s) van trainer X gespeeld zijn.

Vanuit één dienstverband(DV) is dat redelijk te doen maar als er dus meerdere DV zijn dan wordt dat, voor mijn tenminste, een probleem.

Ik zat ook al te denken aan een soort tussentabel met "wedstrijd_ID en trainers_ID"

Offline Thomas - 16/12/2013 21:18
Avatar van Thomas Moderator Mja je kunt het opslaan in een aparte tabel, maar je kunt het ook berekenen in PHP. Ik neem aan dat je ergens een koppeltabel o.i.d. hebt waarin opgeslagen is welke trainer X een dienstverband Y heeft?

Als je dit eerst bepaalt, en dat vervolgens gebruikt om de query voor wedstrijden op te bouwen?

En daarna zou je je dienstverbanden-dataset nog uit kunnen breiden met de wedstrijden die daarbij horen?

Zoiets dus:

  1. <?php
  2. // http://www.sitemasters.be/forum/2/41099/PHP_&_SQL/selecteren_met_uitgebreide_datum_treeks
  3.  
  4. // gegeven een array met dienstverbanden van de vorm:
  5. $dienstverbanden = array(
  6. 1 => array('van' => 'yyyy-mm-dd', 'tot' => 'yyyy-mm-dd', 'wedstrijden' => array()),
  7. 5 => array('van' => 'yyyy-mm-dd', 'tot' => 'yyyy-mm-dd', 'wedstrijden' => array()),
  8. );
  9.  
  10. $wedstrijden = array();
  11.  
  12. // bouw je de query voor het raadplegen van de wedstrijden tabel (als er iets te raadplegen valt):
  13. if (count($dienstverbanden)) {
  14. $query = 'SELECT * FROM wedstrijden WHERE ';
  15. $where = array();
  16. foreach ($dienstverbanden as $dienstverband) {
  17. $where[] = 'wedstrijd_datum BETWEEN ('.$dienstverband['van'].' AND '.$dienstverband['tot'].')';
  18. }
  19. $query .= implode(' OR ', $where);
  20.  
  21. // voer query uit
  22. $res = ...
  23. // loop door resultaten
  24. while ($row = ...) {
  25. // sla wedstrijd data op op id
  26. $wedstrijden[$row['wedstrijd_id']] = $row;
  27. // bepaal in welk dienstverband deze wedstrijd valt, dit keer in PHP
  28. foreach ($dienstverbanden as $d_id => $d_data) {
  29. if ($row['wedstrijd_datum'] >= $d_data['van'] && $row['wedstrijd_datum'] <= $d_data['tot']) {
  30. // de wedstrijd valt onder dit dienstverband
  31. $dienstverbanden[$d_id]['wedstrijden'][] = $row['wedstrijd_id'];
  32. break; // klaar met zoeken
  33. }
  34. }
  35. }
  36. // nu bevat $dienstverbanden alle relevante data,
  37. // en de data van de wedstrijden kun je opzoeken in $wedstrijden m.b.v. de wedstrijd-id's
  38. }
  39. ?>
Offline markla - 16/12/2013 21:23 (laatste wijziging 16/12/2013 21:56)
Avatar van markla PHP interesse Ik ga straks even je script door lezen en kijken of ik hem snap

maar uh, Ik snap niet dat er mensen zijn die zo makkelijk een script uit hun mouw schudden  
Nb
Dat bedoel ik dus als een compliment


Offline Thomas - 17/12/2013 09:44 (laatste wijziging 17/12/2013 09:45)
Avatar van Thomas Moderator Oh, kunnen dienstverbanden (op zichzelf) overlappen? Ik neem aan dat trainers zelf niet meerdere overlappende dienstverbanden hebben? In dat laatste geval is de "break" gerechtvaardigd (een wedstrijd Z behoort tot ten hoogste één dienstverband Y van trainer X), anders moet deze "break" mogelijk weggehaald worden, maar het gevolg daarvan is mogelijk dat je wedstrijden dubbel telt (per trainer).

Het bovenstaande codefragment is bijna een letterlijke vertaling van hoe je stapsgewijs van probleem naar oplossing loopt, daarbij (handig) gebruik makend van zowel PHP als MySQL. Zodra je de "verplichting" laat varen dat je alles met één query op moet lossen (al is het wel een goed ontwerpprincipe om je vraagstuk met zo min mogelijk (of in ieder geval zo efficiënt mogelijke) queries op te lossen) en het probleem opsplitst in kleinere, beheersbare, deelproblemen wordt e.e.a. een stuk gemakkelijker.

Daarbij, als je de manier waarop je je data hebt opgeslagen handig gekozen hebt, maakt dit de klus om specifieke data weer uit je database te trekken super simpel. Dat vergeten mensen nog wel eens: de data moet ook weer makkelijk UIT de database te halen zijn .
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.182s