Competitie met Pijltjes
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:
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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))
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
Gewijzigd op 11/05/2015 10:35:43 door Ger van Steenderen