Ik zoek naar een code in mysql die kan checken of de plaats van het team is gestegen, gelijk of gedaald is.
want daarmee wil ik nadat er een update in de database is uitgevoerd pijltjes weergeven ( omhoog als positie is gestegen , omlaag als is gezakt en een streepje als de positie van het team gelijk is gebleven.
de code van de competitie zelf heb ik al.


dit is de bedoeling!
kan iemand mij hiermee helpen?
Ik persoonlijk geef er de voorkeur aan om standen on the fly te genereren.
Dat is qua onderhoud veel simpeler en minder foutgevoelig.

Maar om de positie van een team te bepalen is er in MySQL geen functie beschikbaar, dus normaal gesproken laat ik in PHP een tellertje meelopen.
In jouw geval gaat dat niet omdat je de positie van de week ervoor nodig hebt, maar dat zou kunnen met de volgende query:

SELECT
	cr.*,
	pr.previous_rank
FROM
	(
	SELECT
		r.*,
		@current_rank := @current_rank + 1 current_rank
	FROM
		(
		SELECT
			t.team_id,
			t.team_naam,
			COUNT(u.wedstrijd_id) gespeeld,
			IFNULL(SUM(CASE
				WHEN t.team_id = w.thuis_id THEN
					CASE
						WHEN u.thuis_score > u.uit_score THEN 3
						WHEN u.thuis_score = u.uit_score THEN 1
						ELSE 0 END
				ELSE
					CASE
						WHEN u.thuis_score < u.uit_score THEN 3
						WHEN u.thuis_score = u.uit_score THEN 1
						ELSE 0 END
				END),0) punten,
			IFNULL(SUM(CASE
					WHEN t.team_id = w.thuis_id THEN u.thuis_score 
					ELSE u.uit_score END),0) doelp_voor,
			IFNULL(SUM(CASE
					WHEN t.team_id = w.uit_id THEN u.thuis_score 
					ELSE u.uit_score END),0) doelp_tegen,
			IFNULL(SUM(CASE
					WHEN t.team_id = w.thuis_id THEN u.thuis_score > u.uitscore
					ELSE u.thuis_score < u.uitscore END),0) gewonnen,
			IFNULL(SUM(u.thuis_score = u.uitscore), 0) gelijk,
			IFNULL(SUM(CASE
					WHEN t.team_id = w.uit_id THEN u.thuis_score > u.uitscore
					ELSE u.thuis_score < u.uitscore END),0) verloren
		FROM
			teams t
		JOIN
			teams_competities c
			ON t.team_id = c.team_id
		LEFT JOIN
			(wedstrijdschema w
			INNER JOIN
				uitslagen u
				ON w.wedstrijd_id = u.wedstrijd_id
			)	
			ON c.competitie_id = w.competitie_id
			AND (t.team_id = w.thuis_id OR t.team_id = w.uit_id)
		WHERE
			c.competitie_id = 1234
		GROUP BY
			t.team_id
		ORDER BY punten DESC, gespeeld, doelp_voor - doelp_tegen DESC, doelp_voor DESC, t.team_naam
		) r
	CROSS JOIN (SELECT @current_rank := 0) u
	) cr
JOIN
	(
	SELECT
		r.team_id,
		@previous_rank := @previous_rank + 1 previous_rank
	FROM
		(
		SELECT
			t.team_id,
			COUNT(u.wedstrijd_id) gespeeld,
			IFNULL(SUM(CASE
				WHEN t.team_id = w.thuis_id THEN
					CASE
						WHEN u.thuis_score > u.uit_score THEN 3
						WHEN u.thuis_score = u.uit_score THEN 1
						ELSE 0 END
				ELSE
					CASE
						WHEN u.thuis_score < u.uit_score THEN 3
						WHEN u.thuis_score = u.uit_score THEN 1
						ELSE 0 END
				END),0) punten,
			IFNULL(SUM(CASE
					WHEN t.team_id = w.thuis_id THEN u.thuis_score 
					ELSE u.uit_score END),0) doelp_voor,
			IFNULL(SUM(CASE
					WHEN t.team_id = w.uit_id THEN u.thuis_score 
					ELSE u.uit_score END),0) doelp_tegen
		FROM
			teams t
		JOIN
			teams_competities c
			ON t.team_id = c.team_id
		LEFT JOIN
			(wedstrijdschema w
			INNER JOIN
				uitslagen u
				ON w.wedstrijd_id = u.wedstrijd_id
			)	
			ON c.competitie_id = w.competitie_id
			AND (t.team_id = w.thuis_id OR t.team_id = w.uit_id)
			AND w.datum <= CURRENT_DATE - INTERVAL 1 WEEK
		WHERE
			c.competitie_id = 1234
		GROUP BY
			t.team_id
		ORDER BY punten DESC, gespeeld, doelp_voor - doelp_tegen DESC, doelp_voor DESC, t.team_naam
		) r
	CROSS JOIN (SELECT @previous_rank := 0) u
	) pr
		USING (team_id))

Regel 6 t/m 59 is de query om de huidige stand te bepalen:
Om in SQL een teller te laten meelopen kan je user variabelen (de @....) gebruiken.
Deze wordt initiëel op 0 gezet met de cross join, en bij elke gevonden rij met één opgehoogd.
Om de juiste waardes te krijgen moet daarvoor echter wel met een subquery in de juiste volgorde geselecteerd worden.

Omdat je wilt vergelijken met de stand van de week ervoor staat dit in een subquery en dan een join op nagenoeg dezelfde subquery met als extra filter de wedstrijddatum

Reageren