Versio

[mysql] Query's + Array's samen mbv Join

Overzicht Reageren

Michael -

Michael -

06/10/2009 11:57:00
Quote Anchor link
Hey Mensen,

Ik maak er een puinhoop van, maar tot nu werkt 't wel.
Alleen nou ik verder wil, loop ik een beetje vast en wordt 't erg ingewikkeld allemaal omdat ik nou meerdere query's en array's heb.
Volgens mij moet ik meer met Join werken, en daar is nou net een tut over, maar snap nog niet goed hoe ik dat hier moet toepassen.
Zou iemand me willen en kunnen helpen?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
<?php
  $dagen
= array("","Zondag", "Maandag", "Dinsdag", "Woensdag", "Donderdag", "Vrijdag","Zaterdag");
// Array aanmaken voor het controleren of speler afwezig is of niet.
  
  $sqlL = "SELECT lid,naam FROM leden WHERE id = ".$_SESSION['id'];
  $resL = mysql_query($sqlL) or die (mysql_error());
  while($rijL = mysql_fetch_assoc($resL))
  {

    $ledenarray[$rijL['lid']] = array();
    // Gegevens van leden ophalen en de id's in een array zetten.

    
    $sqlA = "SELECT lid,id,wanneer
    FROM leden_afwezig
    WHERE lid = "
.$rijL['lid'];
    $resA = mysql_query($sqlA) or die (mysql_error());
    while($rijA = mysql_fetch_assoc($resA))
    {

      $ledenarray[$rijL['lid']][] = $rijA['wanneer'];
     // ophalen wanneer je spelers afwezig zijn, en toevoegen aan zelfde array
    }
    
    $sqlS = "SELECT sid,lid
    FROM spelers
    WHERE lid = "
.$rijL['lid'];
    $resS = mysql_query($sqlS) or die (mysql_error());
    while($rijS = mysql_fetch_assoc($resS))
    {

      $spelersarray[$rijS['sid']][] = $rijS['lid'];
    // Array aanmeken met id uit spelers en id uit leden.
    }
  }

  
  $sqlS = "SELECT sid,tid,uit,datum,DAYOFWEEK(datum) as dag,
  CONCAT(    
    (CASE DATE_FORMAT(datum, '%w')
    WHEN '0' THEN 'zo'
    WHEN '1' THEN 'ma'
    WHEN '2' THEN 'di'
    WHEN '3' THEN 'wo'
    WHEN '4' THEN 'do'
    WHEN '5' THEN 'vr'
    WHEN '6' THEN 'za'
    END),
    ' ',
    (DATE_FORMAT(datum, '%e')),
    ' ',
    (CASE DATE_FORMAT(datum, '%c')
    WHEN '1' THEN 'januari'
    WHEN '2' THEN 'februari'
    WHEN '3' THEN 'maart'
    WHEN '4' THEN 'april'
    WHEN '5' THEN 'mei'
    WHEN '6' THEN 'juni'
    WHEN '7' THEN 'juli'
    WHEN '8' THEN 'augustus'
    WHEN '9' THEN 'september'
    WHEN '10' THEN 'oktober'
    WHEN '11' THEN 'november'
    WHEN '12' THEN 'december'
    END),
    ' ',
    (DATE_FORMAT(datum, '%Y'))
  ) AS datumNL
  FROM speeldatums
  WHERE id = "
.$_SESSION['id'];
  $resS = mysql_query($sqlS) or die (mysql_error());
  $clear=0;
  while($rijS = mysql_fetch_assoc($resS))
  {

  //Gegevens ophalen uit speeldatums
  
    $sqlT = "SELECT tid,tegenstander FROM tegenstanders WHERE tid = ".$rijS['tid'];
    $resT = mysql_query($sqlT) or die (mysql_error());
    while($rijT = mysql_fetch_assoc($resT))
    {

    //Gegevens ophalen uit tegenstanders
      echo '<div id="left" style="width:300px;">'.PHP_EOL;
      echo '<p>Wie: '.inkorten($rijT['tegenstander'],'25').'<br>'.PHP_EOL;
      echo 'Waar: '; if($rijS['uit']) $thuisuit = 'Uit'; else $thuisuit = 'Thuis'; echo $thuisuit.'<br>'.PHP_EOL;
      echo 'Wanneer: '.$rijS['datumNL'].'</p>'.PHP_EOL;
      // gegevens weergeven.
      
      echo '<p>Beschikbare spelers:'.PHP_EOL;
          
      foreach ($ledenarray as $key1=>$value1)
      {

        if(isset($ledenarray[$key1])
        && !
in_array($dagen[$rijS['dag']], $ledenarray[$key1])
        && !
in_array($rijS['datum'], $ledenarray[$key1])
        && !
in_array($thuisuit,$ledenarray[$key1])
        )

       // Alleen spelers die niet afwezig zijn
        {
          $sqlL = "SELECT lid,naam FROM leden WHERE lid = ".$key1;
          $resL = mysql_query($sqlL) or die (mysql_error());
          $rijL = mysql_fetch_assoc($resL);

          echo '<br><input type="checkbox" name="spelers['.$rijS['sid'].'][]" value="'.$key1.'"';
          if(isset($spelersarray[$rijS['sid']]) && in_array($rijL['lid'],$spelersarray[$rijS['sid']]))
            echo ' checked="checked"';
            //Controleren of deze speler al is geselecteerd/in db spelers staat.
          echo ' class="checkbox">'.inkorten($rijL['naam'],'15');
        }
      }

      echo '</p>'.PHP_EOL;
      echo '</div>'.PHP_EOL;
      $clear++;
      if($clear==2) { echo '<div id="clear"></div>'; $clear=0; }
    }
  }

?>


Edit:
Comments toegevoegd. Hopelijk wat duidelijker.
Wat het doet:
Gegevens ophalen uit, leden, leden_afwezig, spelers, speeldatums, tegenstanders.
Daarna kijken welke spelers afwezig zijn (of leden sid in leden_afwezig voorkomt)
Controleren of speler al is geselecteerd en dus checkbox checked.

Nou wil ik random 4 spelers weergeven die niet afwezig zijn, en dat lukt dus nou niet meer omdat 't zo'n puinhoop is ;-)
edit: titel aangepast, misschien wat duidelijker.
Gewijzigd op 01/01/1970 01:00:00 door Michael -
 
PHP hulp

PHP hulp

25/05/2012 06:51:07
Gesponsorde koppelingen:
BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  
 
Robert Deiman

Robert Deiman

06/10/2009 12:05:00
Quote Anchor link
@Turmin

Volgens mij is het handiger helpen als je precies uitlegt wat je wilt en daarbij de verschillende tabellen ook even toelichten.

Op deze manier moeten wij zelf gaan bepalen wat je waarmee wilt bereiken, terwijl het gemakkelijker is als je uitlegt wat je wilt.
 
Michael -

Michael -

06/10/2009 12:09:00
Quote Anchor link
@Robert: Bericht gewijzigd en comments en wat meer info toegevoegd.

Tabellen:
team
- id (auto_increment, int)
- team (varchar 255)

leden:
- lid (auto_increment, int)
- id (int)
- naam (varchar 255)

leden_afwezig:
- lid (int)
- id (int)
- wanneer (varchar 255)

tegenstanders:
- tid (auto_increment, int)
- id (int)
- tegenstander (varchar 255)

speeldatums:
- sid (auto_increment, int)
- id (int)
- tid (int)
- uit (standaard 0, tinyint)
- datum (date)

spelers:
- id (int)
- sid (int)
- lid (int)
Gewijzigd op 01/01/1970 01:00:00 door Michael -
 
Robert Deiman

Robert Deiman

06/10/2009 12:20:00
Quote Anchor link
En wat wil je precies bereiken? Als ik het goed heb wil je:
a) kijken welke spelers er op welke datum niet zijn
b) de spelers die er wel zijn weergeven bij een wedstrijd op een bepaalde datum?
 
Michael -

Michael -

06/10/2009 12:22:00
Quote Anchor link
Robert_Deiman schreef op 06.10.2009 12:20:
En wat wil je precies bereiken? Als ik het goed heb wil je:
a) kijken welke spelers er op welke datum niet zijn
b) de spelers die er wel zijn weergeven bij een wedstrijd op een bepaalde datum?

Klopt. Had dit ook al zo ongeveer bij een edit bij de begin post gezet.
En zo'n kleine handeling in meer dan 100 regels :-$
Edit: Er wordt trouwens niet alleen gekeken welke datum een speler niet kan, maar ook of ze elke maandag,dinsdag,woensdag,donderdag,vrijdag,thuis of uit niet kunnen. Vandaar die 3 in_array's onder elkaar.
Gewijzigd op 01/01/1970 01:00:00 door Michael -
 
Robert Deiman

Robert Deiman

06/10/2009 12:46:00
Quote Anchor link
@Turmin
Ik kijk er misschien overheen, maar hoe geef je dan aan dat ze uit /of thuis niet kunnen?

Ik zie alleen bij een wedstrijd staan of die uit of thuis is, bij "afwezig" zie ik alleen maar dat een speler er niet is, niet of dat voor alle, of alleen uit/thuis wedstrijden is.
 
Michael -

Michael -

06/10/2009 12:49:00
Quote Anchor link
Robert_Deiman schreef op 06.10.2009 12:46:
@Turmin
Ik kijk er misschien overheen, maar hoe geef je dan aan dat ze uit /of thuis niet kunnen?

Ik zie alleen bij een wedstrijd staan of die uit of thuis is, bij "afwezig" zie ik alleen maar dat een speler er niet is, niet of dat voor alle, of alleen uit/thuis wedstrijden is.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
        if(isset($ledenarray[$key1])
        && !
in_array($dagen[$rijS['dag']], $ledenarray[$key1])
        //Controleren of speler op een bepaalde dag niet kan
        && !in_array($rijS['datum'], $ledenarray[$key1])
        // controleren of een speler op een bepaalde datum niet kan
        && !in_array($thuisuit,$ledenarray[$key1])
       // controleren of speler thuis of uit niet kan.
?>

En die $thuisuit komt hier vandaan:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
<?php
echo 'Waar: '; if($rijS['uit']) $thuisuit = 'Uit'; else $thuisuit = 'Thuis'; echo $thuisuit.'<br>'.PHP_EOL; ?>
 
Robert Deiman

Robert Deiman

06/10/2009 13:02:00
Quote Anchor link
Jah, ik snap het nu.. ik had hem zelf ook verkeerd begrepen. Ik dacht even dat spelers ook aan konden geven dat ze thuis wel kunnen, maar uit niet op een bepaalde datum. Dat kon ik niet terug vinden, maar dat hoeft dus ook niet. :)

Ik ben ff Xampp opnieuw aan het installeren, dan ga ik er even mee prutsen.
 
Michael -

Michael -

06/10/2009 13:08:00
Quote Anchor link
Ze kunnen dus alleen aangeven wanneer ze niet kunnen, dan weet je dus ook wanneer ze wel kunnen ;-)
Dit geven ze aan door checkboxen aan te vinken: Ma tm vr, thuis en uit.
Met daaronder een invoerveld voor de datum en wordt opgeslagen in spelers_afwezig.
Super bedankt! :-) Ben benieuwd in hoeveel regels jij het kan ;-)
 
Robert Deiman

Robert Deiman

06/10/2009 13:16:00
Quote Anchor link
Lol, ik ook... maar ik zit nog wel met een paar grote vraagtekens:

Je hebt een tabel spelers en een tabel leden, wat is het verschil? Daarnaast snap ik een aantal koppelingen die je legt (afgaande op je database structuur) ook niet helemaal.

- Een tabel leden en een tabel spelers? Ik mis daar nog een koppeling in (Is een speler niet automatisch lid, wat heb je precies nodig met de lid gegevens als je de speler gegevens kan ophalen?
- Kan een speler meerdere LID hebben? Zo niet, waarom dan een koppeltabel
- Waarvoor wordt in al die tabellen "id" gebruikt? Die heeft volgens mij niets te betekenen (in de meeste tabellen, zeker niet waar al een kolom met auto_increment wordt gebruikt)

Zo zijn er nog wel meer vraagtekens bij je hele structuur, ik kan er niet echt wijs uit worden hoe je dit allemaal in gedachten had. Misschien als je ook even kan uitleggen hoe die opbouw werkt en verder in elkaar steekt dat ik er wat mee kan. Voor nu zie ik als beste optie, opnieuw de db structuur opbouwen.
 
Michael -

Michael -

06/10/2009 13:27:00
Quote Anchor link
Het systeem werkt als volgt:
Je kan een schema aanmaken of inloggen in een bestaand schema.
Daarvoor wordt een random key aangemaakt en opgeslagen, samen met een ID die dan weer in een sessie wordt gezegt: $_SESSION['id']
Die wordt steeds weer gebruikt, om het juiste schema op te halen, vandaar dat in meerdere velden id voor komt.

Stap1:
Je kan je teamnaam invullen en je leden en je tegenstanders.
Teamnaam wordt opgeslagen in 'data' samen met de key (als ie al niet was opgeslagen).
Je leden worden opgeslagen in 'leden'
Je tegenstanders worden opgeslagen in 'tegenstanders'

Stap2:
Alle tegenstanders worden getoond en je kunt de datum's invullen wanneer er tegen hun wordt gespeeld en of 't een thuis of uit wedstrijd is.
Dit wordt opgeslagen in 'speeldatums' (en de ID er weer bij)

Stap3:
Alle spelers worden getoond en je kan aangeven wanneer de spelers niet kunnen.
Dit wordt opgeslagen in 'leden_afwezig'

Stap4:
Dat is 't script wat in m'n eerste post staat.
Alle wedstrijden worden getoond en voor elke wedstrijd kun je spelers uit de beschikbare spelers kiezen (dit moet uit eindelijk random gebeuren).
De spelers die zijn gekozen worden opgeslagen in 'spelers'.
 
Michael -

Michael -

08/10/2009 13:46:00
Quote Anchor link
Bump.
Gewijzigd op 01/01/1970 01:00:00 door Michael -
 
Jan Willem van der Veer

Jan Willem van der Veer

08/10/2009 15:14:00
Quote Anchor link
Kun je je vraag nog een keer stellen met de status van hoe ver je op dit moment bent? Ik denk dat de gemiddelde persoon A. Geen zin heeft om het hele topic tot op dit moment door te werken, B. niet heel wijs wordt als ie het topic door gaat werken.
 
Michael -

Michael -

08/10/2009 16:35:00
Quote Anchor link
Het is de bedoeling dat het hele script in de start topic in 1 query, of in ieder geval veel korter, gemaakt wordt. En niet zo rommelig met al die array's en query's. Want 't werkt nu wel, maar als je 't wilt uitbreiden gaat 't dus mis. Ik ben nou bezig om joins te begrijpen en heb de tut van robert al een paar keer gelezen, maar valt toch vies tegen om dat hele script in te korten.

De query van speeldatums en van leden heb ik nu wel samen kunnen voegen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
<?php
//regel 34 tm 92 van script in start topic in een join

$sqlST = "SELECT
  t.tid
  ,t.tegenstander
  ,s.sid
  ,s.tid
  ,s.uit
  ,s.datum
  ,DAYOFWEEK(s.datum) as dag
  ,CONCAT(    
    (CASE DATE_FORMAT(s.datum, '%w')
    WHEN '0' THEN 'zo'
    WHEN '1' THEN 'ma'
    WHEN '2' THEN 'di'
    WHEN '3' THEN 'wo'
    WHEN '4' THEN 'do'
    WHEN '5' THEN 'vr'
    WHEN '6' THEN 'za'
    END),
    ' ',
    (DATE_FORMAT(s.datum, '%e')),
    ' ',
    (CASE DATE_FORMAT(s.datum, '%c')
    WHEN '1' THEN 'januari'
    WHEN '2' THEN 'februari'
    WHEN '3' THEN 'maart'
    WHEN '4' THEN 'april'
    WHEN '5' THEN 'mei'
    WHEN '6' THEN 'juni'
    WHEN '7' THEN 'juli'
    WHEN '8' THEN 'augustus'
    WHEN '9' THEN 'september'
    WHEN '10' THEN 'oktober'
    WHEN '11' THEN 'november'
    WHEN '12' THEN 'december'
    END),
    ' ',
    (DATE_FORMAT(s.datum, '%Y'))
  ) AS datumNL
  FROM speeldatums AS s
  INNER JOIN tegenstanders AS t
  ON s.tid = t.tid
  WHERE s.id = "
.$_SESSION['id'];
  
  $resST = mysql_query($sqlST);
  if (!($resST = mysql_query ($sqlST))) {
  trigger_error (mysql_error ());
  }

  $clear=0;
  while($rijST = mysql_fetch_assoc($resST))
  {

    //Gegevens ophalen uit tegenstanders
      echo '<div id="left" style="width:300px;">'.PHP_EOL;
      echo '<p>Wie: '.$rijST['tegenstander'].'<br>'.PHP_EOL;
      echo 'Waar: '; if($rijST['uit']) $thuisuit = 'Uit'; else $thuisuit = 'Thuis'; echo $thuisuit.'<br>'.PHP_EOL;
      echo 'Wanneer: '.$rijST['datumNL'].'</p>'.PHP_EOL;
      // gegevens weergeven.
      
      echo '<p>Beschikbare spelers:'.PHP_EOL;
          
      foreach ($ledenarray as $key1=>$value1)
      {

        if(isset($ledenarray[$key1])
        && !
in_array($dagen[$rijST['dag']], $ledenarray[$key1])
        && !
in_array($rijST['datum'], $ledenarray[$key1])
        && !
in_array($thuisuit,$ledenarray[$key1])
        )

?>


Dit werkt. Maar nou zit ik nog met 3 array's en 4 query's die hopelijk ook samen kunnen worden gevoegd of in iedergeval korter.
(En dit is nog maar een klein stukje van 't hele script, maar hierna hoop ik 't te begrijpen en de rest zelf te kunnen)
Gewijzigd op 01/01/1970 01:00:00 door Michael -
 
Jan Willem van der Veer

Jan Willem van der Veer

08/10/2009 16:49:00
Quote Anchor link
Quote:
CONCAT(
(CASE DATE_FORMAT(s.datum, '%w')
WHEN '0' THEN 'zo'
WHEN '1' THEN 'ma'
WHEN '2' THEN 'di'
WHEN '3' THEN 'wo'
WHEN '4' THEN 'do'
WHEN '5' THEN 'vr'
WHEN '6' THEN 'za'
END),
' ',
(DATE_FORMAT(s.datum, '%e')),
' ',
(CASE DATE_FORMAT(s.datum, '%c')
WHEN '1' THEN 'januari'
WHEN '2' THEN 'februari'
WHEN '3' THEN 'maart'
WHEN '4' THEN 'april'
WHEN '5' THEN 'mei'
WHEN '6' THEN 'juni'
WHEN '7' THEN 'juli'
WHEN '8' THEN 'augustus'
WHEN '9' THEN 'september'
WHEN '10' THEN 'oktober'
WHEN '11' THEN 'november'
WHEN '12' THEN 'december'
END),
' ',
(DATE_FORMAT(s.datum, '%Y'))
) AS datumNL
Dit zou ik sowieso in PHP doen, omdat het in PHP gewoon een stuk korter kan. Gewoon die verschillende getalletjes binnenhalen of gewoon de timestamp en dit probleem met PHP oplossen.

En natuurlijk moet je ook ergens de vraag stellen of iets wel korter moet. Als iets gewoon goed (foutloos, probleemloos en snel) werkt, waarom zou je het dan korter willen hebben?
 
Michael -

Michael -

08/10/2009 17:07:00
Quote Anchor link
Die datum laat ik liever gewoon via mysql. Wat mysql kan moet je php niet laten doen zeggen ze altijd.
Ik wil 't korter omdat ik kei veel array's en query's heb en nu vast loop.
En 't kan ook gewoon korter en ik wil dat dus ook leren om meer dingen in 1 query te doen. Ik ben van mening dat er op die paar regels geen 3 array's en 5query's (met nieuwe stukje dan 4) nodig zijn.
Edit: in het totale script heb ik ongeveer 20 query en 18 array's. Ik vind dat dit zeker wel gehalveerd kan worden.
Gewijzigd op 01/01/1970 01:00:00 door Michael -
 
Michael -

Michael -

10/10/2009 19:39:00
Quote Anchor link
Wil iemand me nog helpen? Hoe kan ik dat met die Array's in een query oplossen?
 
Michael -

Michael -

14/10/2009 13:55:00
Quote Anchor link
Niemand die 't weet? Idee? Schop in de goede richting?
 
Eddy Erkelens

Eddy Erkelens

14/10/2009 14:09:00
Quote Anchor link
4 berichten hiervoor zie ik toch 1 query?
En haal die afschuwelijke datum-opmaak-sql-bende eens weg en pak gewoon strftime() in php!
(althans, is mijn advies).
 
Michael -

Michael -

14/10/2009 14:11:00
Quote Anchor link
Mysql kan dit veel sneller.
Dat is een gedeelte van 't script ja. Daarin zitten nog niet de array's en die andere 4 query's in verwerkt.
 



Overzicht Reageren