Results Query 1 hergebruiken in Query 2
Ik ben bezig met een webtool voor het spel FM2011. Vind PHPen erg leuk en FM2011 ook wel, dus een mooie combinatie.
Ben inmiddels al aardig op weg.
Hieronder staan twee query's. De eerste selecteert de 4 beste spelers voor (in dit geval) de spits positie. De tweede query selecteert de 2 beste jeugdspelers.
De bedoeling van deze query's is om de beste keuze te maken voor de spits positie, en ook te weten welke jeugdspelers af en toe mee kunnen doen om ervaring op te doen in het eerste.
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
31
32
33
34
35
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
<?php
$PosSC = "
SELECT *
FROM beoordeling
JOIN speler
ON beoordeling.SpelerID = speler.SpelerID
WHERE datum>='$checkdate'
AND pos='SC'
ORDER BY score DESC
LIMIT 4";
$run_PosSC = mysql_query($PosSC);
while ($row = mysql_fetch_assoc($run_PosSC)) {
echo '<div class="V_naam">'.$natuurimage[$row["natuur"]].' '.$stars[$row["nu"]].' '.$row["Bijnaam"].' ('.floor(((strtotime("now") - strtotime($row["Geboortedatum"])) / (60*60*24*365))).') '.$stars[$row["pot"]].' <span class="tekst9">'.date("y", strtotime($row["ContractBegin"])).'</span>-'.date("y", strtotime($row["ContractEind"])).'</div>';
}
$PosSC2 = "
SELECT *
FROM beoordeling
JOIN speler
ON beoordeling.SpelerID = speler.SpelerID
WHERE speler.Jeugd='1'
AND beoordeling.SpelerID!='124'
AND beoordeling.datum>='$checkdate'
AND pos='SC'
ORDER BY score DESC
LIMIT 2";
$run_PosSC2 = mysql_query($PosSC2);
while ($row2 = mysql_fetch_assoc($run_PosSC2)) {
echo '<div class="V_naam">'.$natuurimage[$row2["natuur"]].' '.$stars[$row2["nu"]].' '.$row2["Bijnaam"].' ('.floor(((strtotime("now") - strtotime($row2["Geboortedatum"])) / (60*60*24*365))).') '.$stars[$row2["pot"]].' <span class="tekst9">'.date("y", strtotime($row2["ContractBegin"])).'</span>-'.date("y", strtotime($row2["ContractEind"])).'</div>';
}
?>
$PosSC = "
SELECT *
FROM beoordeling
JOIN speler
ON beoordeling.SpelerID = speler.SpelerID
WHERE datum>='$checkdate'
AND pos='SC'
ORDER BY score DESC
LIMIT 4";
$run_PosSC = mysql_query($PosSC);
while ($row = mysql_fetch_assoc($run_PosSC)) {
echo '<div class="V_naam">'.$natuurimage[$row["natuur"]].' '.$stars[$row["nu"]].' '.$row["Bijnaam"].' ('.floor(((strtotime("now") - strtotime($row["Geboortedatum"])) / (60*60*24*365))).') '.$stars[$row["pot"]].' <span class="tekst9">'.date("y", strtotime($row["ContractBegin"])).'</span>-'.date("y", strtotime($row["ContractEind"])).'</div>';
}
$PosSC2 = "
SELECT *
FROM beoordeling
JOIN speler
ON beoordeling.SpelerID = speler.SpelerID
WHERE speler.Jeugd='1'
AND beoordeling.SpelerID!='124'
AND beoordeling.datum>='$checkdate'
AND pos='SC'
ORDER BY score DESC
LIMIT 2";
$run_PosSC2 = mysql_query($PosSC2);
while ($row2 = mysql_fetch_assoc($run_PosSC2)) {
echo '<div class="V_naam">'.$natuurimage[$row2["natuur"]].' '.$stars[$row2["nu"]].' '.$row2["Bijnaam"].' ('.floor(((strtotime("now") - strtotime($row2["Geboortedatum"])) / (60*60*24*365))).') '.$stars[$row2["pot"]].' <span class="tekst9">'.date("y", strtotime($row2["ContractBegin"])).'</span>-'.date("y", strtotime($row2["ContractEind"])).'</div>';
}
?>
Er zijn twee tabellen. In de tabel 'speler' staat informatie als bijvoorbeeld spelersnaam, bijnaam, geboortedatum, jeugd/eerste... In de tweede tabel 'beoordeling' komen 3-maandelijkse beoordelingen (gebasseerd op klasse nu en klasse potentieel) van de spelers om zo uit te rekenen wie de beste speler is. Hiervoor moest ik dus een JOIN gebruiken, wat verder ook allemaal werkt.
Maar nu komt het volgende probleem. Bij de 4 beste spelers zit Kolseth en bij de 2 beste jeugdspelers zit ook Kolseth. Ik wil dus in dit geval Kolseth alleen bij de 4 beste spelers hebben en bij de jeugdspelers de volgende jeugdspeler in de rij zien.
Ik had in de 2e query al een begin gemaakt met "beoordeling.SpelerID!='124'", maar ipv dat ik hier handmatig het speler ID zet moet dit dus automatisch gaan. Wel weet ik hieruit dat kolom!='id' werkt.
Dus hoe kan ik het beste de resultaten uit de vorige query gebruiken in de nieuwe query?
Groeten Chris
Toevoeging op 18/07/2011 14:45:53:
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
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
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
<?php
$thelimit = 4;
$PosSC = "
SELECT *
FROM beoordeling
JOIN speler
ON beoordeling.SpelerID = speler.SpelerID
WHERE datum>='$checkdate'
AND pos='SC'
ORDER BY score DESC
LIMIT $thelimit";
$run_PosSC = mysql_query($PosSC);
while ($row = mysql_fetch_assoc($run_PosSC)) {
echo '<div class="V_naam">'.$natuurimage[$row["natuur"]].' '.$stars[$row["nu"]].' '.$row["Bijnaam"].' ('.floor(((strtotime("now") - strtotime($row["Geboortedatum"])) / (60*60*24*365))).') '.$stars[$row["pot"]].' <span class="tekst9">'.date("y", strtotime($row["ContractBegin"])).'</span>-'.date("y", strtotime($row["ContractEind"])).'</div>';
}
$resulteen = mysql_query("
SELECT speler.SpelerID, Bijnaam
FROM beoordeling
JOIN speler
ON beoordeling.SpelerID = speler.SpelerID
WHERE datum>='$checkdate'
AND pos='SC'
ORDER BY score DESC
LIMIT 1");
$roween = mysql_fetch_row($resulteen);
$resulttwee = mysql_query("
SELECT speler.SpelerID, Bijnaam
FROM beoordeling
JOIN speler
ON beoordeling.SpelerID = speler.SpelerID
WHERE datum>='$checkdate'
AND pos='SC'
ORDER BY score DESC
LIMIT 1,1");
$rowtwee = mysql_fetch_row($resulttwee);
$resultdrie = mysql_query("
SELECT speler.SpelerID, Bijnaam
FROM beoordeling
JOIN speler
ON beoordeling.SpelerID = speler.SpelerID
WHERE datum>='$checkdate'
AND pos='SC'
ORDER BY score DESC
LIMIT 2,1");
$rowdrie = mysql_fetch_row($resultdrie);
$resultvier = mysql_query("
SELECT speler.SpelerID, Bijnaam
FROM beoordeling
JOIN speler
ON beoordeling.SpelerID = speler.SpelerID
WHERE datum>='$checkdate'
AND pos='SC'
ORDER BY score DESC
LIMIT 3,1");
$rowvier = mysql_fetch_row($resultvier);
$poging1 = $roween[0];
$poging2 = $rowtwee[0];
$poging3 = $rowdrie[0];
$poging4 = $rowvier[0];
$PosSC2 = "
SELECT *
FROM beoordeling
JOIN speler
ON beoordeling.SpelerID = speler.SpelerID
WHERE speler.Jeugd='1'
AND beoordeling.SpelerID!='$poging1'
AND beoordeling.SpelerID!='$poging2'
AND beoordeling.SpelerID!='$poging3'
AND beoordeling.SpelerID!='$poging4'
AND beoordeling.datum>='$checkdate'
AND pos='SC'
ORDER BY score DESC
LIMIT 2";
?>
$thelimit = 4;
$PosSC = "
SELECT *
FROM beoordeling
JOIN speler
ON beoordeling.SpelerID = speler.SpelerID
WHERE datum>='$checkdate'
AND pos='SC'
ORDER BY score DESC
LIMIT $thelimit";
$run_PosSC = mysql_query($PosSC);
while ($row = mysql_fetch_assoc($run_PosSC)) {
echo '<div class="V_naam">'.$natuurimage[$row["natuur"]].' '.$stars[$row["nu"]].' '.$row["Bijnaam"].' ('.floor(((strtotime("now") - strtotime($row["Geboortedatum"])) / (60*60*24*365))).') '.$stars[$row["pot"]].' <span class="tekst9">'.date("y", strtotime($row["ContractBegin"])).'</span>-'.date("y", strtotime($row["ContractEind"])).'</div>';
}
$resulteen = mysql_query("
SELECT speler.SpelerID, Bijnaam
FROM beoordeling
JOIN speler
ON beoordeling.SpelerID = speler.SpelerID
WHERE datum>='$checkdate'
AND pos='SC'
ORDER BY score DESC
LIMIT 1");
$roween = mysql_fetch_row($resulteen);
$resulttwee = mysql_query("
SELECT speler.SpelerID, Bijnaam
FROM beoordeling
JOIN speler
ON beoordeling.SpelerID = speler.SpelerID
WHERE datum>='$checkdate'
AND pos='SC'
ORDER BY score DESC
LIMIT 1,1");
$rowtwee = mysql_fetch_row($resulttwee);
$resultdrie = mysql_query("
SELECT speler.SpelerID, Bijnaam
FROM beoordeling
JOIN speler
ON beoordeling.SpelerID = speler.SpelerID
WHERE datum>='$checkdate'
AND pos='SC'
ORDER BY score DESC
LIMIT 2,1");
$rowdrie = mysql_fetch_row($resultdrie);
$resultvier = mysql_query("
SELECT speler.SpelerID, Bijnaam
FROM beoordeling
JOIN speler
ON beoordeling.SpelerID = speler.SpelerID
WHERE datum>='$checkdate'
AND pos='SC'
ORDER BY score DESC
LIMIT 3,1");
$rowvier = mysql_fetch_row($resultvier);
$poging1 = $roween[0];
$poging2 = $rowtwee[0];
$poging3 = $rowdrie[0];
$poging4 = $rowvier[0];
$PosSC2 = "
SELECT *
FROM beoordeling
JOIN speler
ON beoordeling.SpelerID = speler.SpelerID
WHERE speler.Jeugd='1'
AND beoordeling.SpelerID!='$poging1'
AND beoordeling.SpelerID!='$poging2'
AND beoordeling.SpelerID!='$poging3'
AND beoordeling.SpelerID!='$poging4'
AND beoordeling.datum>='$checkdate'
AND pos='SC'
ORDER BY score DESC
LIMIT 2";
?>
Dit werkt wel maar ik denk dat het nog veel korter kan. Want moet nog 10 andere posities, dus wordt denk ik een dikke lap tekst.
Als iemand weet, of mij een duw in de richting kan geven, hoe je in één keer de resultaten hergebruikt uit de eerdere query zou dat geweldig zijn!
Groeten
Gewijzigd op 18/07/2011 14:49:22 door Chris PHPAccount
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$PosSC2 = "SELECT *
FROM beoordeling
JOIN speler
ON beoordeling.SpelerID = speler.SpelerID
WHERE speler.Jeugd='1'
AND beoordeling.datum>='$checkdate'
AND pos='SC'
AND Speler_ID
NOT IN (SELECT *
FROM beoordeling
JOIN speler
ON beoordeling.SpelerID = speler.SpelerID
WHERE datum>='$checkdate'
AND pos='SC'
ORDER BY score DESC
LIMIT $thelimit)
ORDER BY score DESC
LIMIT 2 ";
?>
$PosSC2 = "SELECT *
FROM beoordeling
JOIN speler
ON beoordeling.SpelerID = speler.SpelerID
WHERE speler.Jeugd='1'
AND beoordeling.datum>='$checkdate'
AND pos='SC'
AND Speler_ID
NOT IN (SELECT *
FROM beoordeling
JOIN speler
ON beoordeling.SpelerID = speler.SpelerID
WHERE datum>='$checkdate'
AND pos='SC'
ORDER BY score DESC
LIMIT $thelimit)
ORDER BY score DESC
LIMIT 2 ";
?>
Zo lijkt mij dus? Maar dat geeft wel een error:
Quote:
Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in C:\domains\chris.sohosted.com\wwwroot\FM\FM_Pos\testfase\include\VELD.php on line 128
Lijn 128 lijkt mij niet het probleem te zijn, die voert de query uit en werkte eerder wel terwijl ik er nu niks aan veranderd heb.
Gewijzigd op 18/07/2011 15:36:07 door Chris PHPAccount
Bouw nette foutafhandeling in. Je query is blijkbaar niet gelukt. Hou $vars altijd buiten de quotes.
Selecteer in die subquery alleen het id, anders zal je query niet werken.
ps. En volg het advies van SanThe op, dan was je zelf waarschijnlijk ook al in deze richting gekomen.
Quote:
1235: This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
Het lijkt er op dat ik nu toch echt over moet naar MySQL 5.
Of is er nog een andere oplossing?
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$aIDs = [array met id's]
$sql = "
SELECT ..
FROM ...
WHERE speler_id IN (".implode(',', $aIDs).")
";
?>
$aIDs = [array met id's]
$sql = "
SELECT ..
FROM ...
WHERE speler_id IN (".implode(',', $aIDs).")
";
?>