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