Results Query 1 hergebruiken in Query 2

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Chris PHPAccount

Chris PHPAccount

18/07/2011 12:54:53
Quote Anchor link
Goedemiddag

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)
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
<?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>';
}

?>


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)
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
<?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"
;
?>


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
 
PHP hulp

PHP hulp

24/12/2024 02:37:04
 
Joren de Wit

Joren de Wit

18/07/2011 15:12:07
Quote Anchor link
Kijk eens naar het gebruik van een subquery met IN() om de id's van al opgehaalde spelers uit te sluiten. Globale structuur van je query zou dan zoiets worden:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
SELECT
  ...
FROM
  ...
WHERE
  [criterium jeugdspeler]
AND
  speler_id NOT IN (
    [query die id's van 4 beste spelers ophaalt]
  )
ORDER BY ...
LIMIT 2
 
Chris PHPAccount

Chris PHPAccount

18/07/2011 15:35:34
Quote Anchor link
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
<?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 "
;
?>

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
 
- SanThe -

- SanThe -

18/07/2011 15:59:52
Quote Anchor link
Bouw nette foutafhandeling in. Je query is blijkbaar niet gelukt. Hou $vars altijd buiten de quotes.
 
Joren de Wit

Joren de Wit

18/07/2011 16:07:05
Quote Anchor link
Als je met mysql_error() de foutmelding ophaalt en weergeeft, zul je iets krijgen in de trend van 'subquery geeft meer dan 1 resultaat terug'. Dat is namelijk precies wat gebeurt met dat * dat je gebruikt...

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.
 
Chris PHPAccount

Chris PHPAccount

18/07/2011 17:40:36
Quote Anchor link
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?
 
Joren de Wit

Joren de Wit

18/07/2011 17:44:08
Quote Anchor link
Er twee aparte queries van maken. Met behulp van de resultaten van de eerste query zet je de id's van de 4 beste in een array. Deze array kun je vervolgens gebruiken om het gedeelte van de tweede query in het IN() gedeelte te construeren:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
$aIDs
= [array met id's]

$sql = "
  SELECT ..
  FROM ...
  WHERE speler_id IN (".implode('
,', $aIDs).")
"
;
?>
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.