Beste forumleden,

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?


$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];

		
	}


(Bovenstaande query met dank aan forumlid Ger)

En daarna echo ik deze in mijn site met behulp van <?php echo $positie; ?> (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.

[size=xsmall]Toevoeging op 08/07/2015 09:10:49:[/size]

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...
Je kan inderdaad met mysqli_query maar één SQL statement uitvoeren.
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:

......
AS rc CROSS JOIN (SELECT @rowcount := 0) var) sc
......

He Ger!

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?



Jo,

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.
He Jeroen,

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!

[size=xsmall]Toevoeging op 08/07/2015 15:02:08:[/size]

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.

$clubnaam = "FC Utrecht";
$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:

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.
<?php
if($clubnaam == $stand1['clubnaam'])
echo $stand1['position'];
?>

Reageren