Stand competitie - extra column met positie (getal)
Doel: laten zien van een klein deel van de ranglijst van een competitie. Dus als een club 8e staat dan wil ik het gedeelte van de stand laten zien van 6 t/m 10 (dus 5 clubs met de club in kwestie in het midden).
Mijn aanpak is om dit in een aantal stappen te doen. Stap 1 daarvan is om de positie op de stand te bepalen van de club in kwestie. Dit getal daarna op te slaan in een variabele X en daarna de stand query nog een keer draaien maar nu gebruik maken van limit (LIMIT X,5). (ik weet dat bij de bovenste en onderste 2 posities dit niet correct is , maar dat is voor latere zorg...)
Maar nu heb ik problemen met de functie ROW_NUMBER(). Als ik in mijn phpmyadmin (versie 5.5.27) deze functie gebruik wordt ik er steeds uit gegooid.
Nu vond ik een andere aanpak door "SET @rowcount = 0;" te gebruiken in combinatie met "@rowcount := @rowcount + 1".
Dit werkt perfect in phpmyadmin, maar zodra ik deze gebruik in mijn site werkt dit opeens niet meer. kan iemand mij helpen?
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
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
$positie = '';
$sql_club_5 = "SET @rowcount = 0;
SELECT sc.position
FROM (
SELECT
@rowcount := @rowcount + 1 AS position, rc.clubID, rc.clubnaam, rc.gespeeld, rc.doelp_voor, rc.doelp_tegen, rc.punt_totaal
FROM
(SELECT
tbl_clubs.clubID,
tbl_clubs.clubnaam,
SUM(IF(tbl_clubs.clubID = u.thuisclubID,
CASE
WHEN u.thuisscore > u.uitscore THEN 3
WHEN u.thuisscore = u.uitscore THEN 1
ELSE 0 END
,
CASE
WHEN u.thuisscore < u.uitscore THEN 3
WHEN u.thuisscore = u.uitscore THEN 1
ELSE 0 END
)) punt_totaal,
COUNT(u.wedstrijdID) gespeeld,
SUM(IF(tbl_clubs.clubID = u.thuisclubID,
IF(u.thuisscore > u.uitscore, 1, 0),
IF(u.thuisscore < u.uitscore, 1, 0)
)) gewonnen,
SUM(IF(tbl_clubs.clubID = u.thuisclubID,
IF(u.thuisscore < u.uitscore, 1, 0),
IF(u.thuisscore > u.uitscore, 1, 0)
)) verloren,
SUM(IF(u.thuisscore = u.uitscore, 1, 0)) gelijk,
SUM(IF(tbl_clubs.clubID = u.thuisclubID, thuisscore, uitscore)) doelp_voor,
SUM(IF(tbl_clubs.clubID = u.thuisclubID, uitscore, thuisscore)) doelp_tegen,
SUM(IF(tbl_clubs.clubID = u.thuisclubID, thuisscore, uitscore)) -
SUM(IF(tbl_clubs.clubID = u.thuisclubID, uitscore, thuisscore)) doelsaldo
FROM
tbl_clubs
LEFT JOIN
(SELECT
wedstrijdID,
w.thuisclubID,
w.uitclubID,
COUNT(IF(d.thuisclub_uitclub = 'thuis', 1, NULL)) thuisscore,
COUNT(IF(d.thuisclub_uitclub = 'uit', 1, NULL)) uitscore
FROM
tbl_wedstrijden w
LEFT JOIN
tbl_doelpunten d
USING (wedstrijdID)
WHERE w.datumwedstrijd BETWEEN '2012-08-09' AND '2012-08-20'
GROUP BY wedstrijdID, w.thuisclubID, w.uitclubID
) u
ON tbl_clubs.clubID = u.thuisclubID OR tbl_clubs.clubID = u.uitclubID
GROUP BY tbl_clubs.clubID, tbl_clubs.clubnaam
ORDER BY punt_totaal DESC, gespeeld, doelsaldo DESC, doelp_voor DESC)
AS rc) sc
WHERE sc.clubID = '$clubID'";
$posi = mysqli_query($hello, $sql_club_5);
if(mysqli_num_rows($posi) > 0){
$row = mysqli_fetch_row($posi);
$positie = $row[0];
}
$sql_club_5 = "SET @rowcount = 0;
SELECT sc.position
FROM (
SELECT
@rowcount := @rowcount + 1 AS position, rc.clubID, rc.clubnaam, rc.gespeeld, rc.doelp_voor, rc.doelp_tegen, rc.punt_totaal
FROM
(SELECT
tbl_clubs.clubID,
tbl_clubs.clubnaam,
SUM(IF(tbl_clubs.clubID = u.thuisclubID,
CASE
WHEN u.thuisscore > u.uitscore THEN 3
WHEN u.thuisscore = u.uitscore THEN 1
ELSE 0 END
,
CASE
WHEN u.thuisscore < u.uitscore THEN 3
WHEN u.thuisscore = u.uitscore THEN 1
ELSE 0 END
)) punt_totaal,
COUNT(u.wedstrijdID) gespeeld,
SUM(IF(tbl_clubs.clubID = u.thuisclubID,
IF(u.thuisscore > u.uitscore, 1, 0),
IF(u.thuisscore < u.uitscore, 1, 0)
)) gewonnen,
SUM(IF(tbl_clubs.clubID = u.thuisclubID,
IF(u.thuisscore < u.uitscore, 1, 0),
IF(u.thuisscore > u.uitscore, 1, 0)
)) verloren,
SUM(IF(u.thuisscore = u.uitscore, 1, 0)) gelijk,
SUM(IF(tbl_clubs.clubID = u.thuisclubID, thuisscore, uitscore)) doelp_voor,
SUM(IF(tbl_clubs.clubID = u.thuisclubID, uitscore, thuisscore)) doelp_tegen,
SUM(IF(tbl_clubs.clubID = u.thuisclubID, thuisscore, uitscore)) -
SUM(IF(tbl_clubs.clubID = u.thuisclubID, uitscore, thuisscore)) doelsaldo
FROM
tbl_clubs
LEFT JOIN
(SELECT
wedstrijdID,
w.thuisclubID,
w.uitclubID,
COUNT(IF(d.thuisclub_uitclub = 'thuis', 1, NULL)) thuisscore,
COUNT(IF(d.thuisclub_uitclub = 'uit', 1, NULL)) uitscore
FROM
tbl_wedstrijden w
LEFT JOIN
tbl_doelpunten d
USING (wedstrijdID)
WHERE w.datumwedstrijd BETWEEN '2012-08-09' AND '2012-08-20'
GROUP BY wedstrijdID, w.thuisclubID, w.uitclubID
) u
ON tbl_clubs.clubID = u.thuisclubID OR tbl_clubs.clubID = u.uitclubID
GROUP BY tbl_clubs.clubID, tbl_clubs.clubnaam
ORDER BY punt_totaal DESC, gespeeld, doelsaldo DESC, doelp_voor DESC)
AS rc) sc
WHERE sc.clubID = '$clubID'";
$posi = mysqli_query($hello, $sql_club_5);
if(mysqli_num_rows($posi) > 0){
$row = mysqli_fetch_row($posi);
$positie = $row[0];
}
(Bovenstaande query met dank aan forumlid Ger)
En daarna echo ik deze in mijn site met behulp van (gewoon om te kijken of dit werkt). In phpmyadmin krijg ik als ik de query draai het getal 8 eruit (de stand op de ranglijst). Op mijn site werkt dit niet. Kan iemand mijn helpen?
PS: het ligt niet aan de variabale '$clubID'.. Want deze werkt wel bij andere queries op dezelfde pagina.
Toevoeging op 08/07/2015 09:10:49:
Zou het ermee te maken kunnen hebben dat de mysql_query niet 2 statements tegelijk aan kan? Zo ja, hoe los ik dit probleem op?
Het lijkt me toch niet echt rocketscience of een heel uitzonderlijke wens die ik heb...
Gewijzigd op 08/07/2015 07:18:51 door Jo Immanuel
Je kan met mysqli_multi_query meerdere query's tegelijk uitvoeren, maar dan moet je ook weer de diverse resultaten aflopen.
Tweede optie is de toekenning van de variable als losse query uit te voeren.
Derde optie is om die toekenning via een cross join mee te nemen:
Ik had al de stille hoop jou hier te treffen. En die hoop was gerechtvaardigd. Ik heb voor optie 3 gekozen en het werkt! Wederom heel erg bedankt.
Zou ik je nog willen vragen: gevoelsmatig is mijn aanpak niet perfect. Ik draai nu 2 keer dezelfde stand-query. Zou dit niet efficiënter kunnen?
ik zou het WHERE stukje uit de query laten en gewoon de gehele stand in een keer ophalen en in een array wegzetten. Deze array kun je dan doorlopen om te bepalen op welke positie de club staat. Hierna kun je de array nogmaals doorlopen en dan de rijen weergeven die je wilt hebben op basis van de positie van de club. Ik denk dat het dan wat sneller gaat dan wanneer je de query twee keer uitvoert.
Nou, dat was dus het antwoord op mijn vervolgvraag.
Resume:
1. stand query zonder LIMIT
2. resultaat in array zetten
3. array doorlopen om rij van clubID te zoeken
4. met die informatie de array doorlopen en gewenste 5 clubs weergeven.
Dank!
Toevoeging op 08/07/2015 15:02:08:
Nu loop ik weer vast.
Het lukt me niet om uit de associative array de waarde van "position" te krijgen die hoort bij een $clubnaam.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
$clubnaam = "FC Utrecht";
$sql_club_5 = ".....";
$standquery = mysqli_query($hello, $sql_club_5);
while ($stand = mysqli_fetch_array($standquery, MYSQLI_ASSOC)) {
$stand1 = $stand;
}
$sql_club_5 = ".....";
$standquery = mysqli_query($hello, $sql_club_5);
while ($stand = mysqli_fetch_array($standquery, MYSQLI_ASSOC)) {
$stand1 = $stand;
}
Als ik dan als volgt echo:
Code (php)
1
echo "{$stand1['position']}|{$stand1['clubnaam']}|{$stand1['gespeeld']}|{$stand1['doelp_voor']}|{$stand1['doelp_tegen']}|{$stand1['punt_totaal']}|";
Dan komt er heel mooi een rij met de volgende gegevens:
1|FC Twente|2|5|1|6|2|afc Ajax|2|8|3|4|3|AZ|2|5|3|4|4|RKC Waalwijk|2|5|4|4|5|Vitesse|2|3|2|4|6|Feyenoord|2|2|1|4|7|PSV|2|7|3|3|8|FC Utrecht|2|3|2|3|9|N.E.C.|2|3|6|3|10|ADO Den Haag|2|4|4|2|11|Willem II|2|2|2|2|12|NAC Breda|2|1|2|1|13|PEC Zwolle|2|1|2|1|14|Heracles|2|2|4|1|15|VVV-Venlo|2|2|4|1|16|sc Heerenveen|2|1|3|1|17|FC Groningen|2|2|5|1|18|Roda JC|2|1|6|1
Maar nu wil ik dus deze array doorzoeken naar een regel met clubnaam en dat ik de waarde van de positie ("position") op de stand (in dit geval dus 8) terug krijg. En dat lukt me niet.
Gewijzigd op 08/07/2015 15:06:52 door Jo Immanuel
ok, thanx!