Competitie met Pijltjes

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2

Ger van Steenderen
Tutorial mod

Ger van Steenderen

11/05/2015 10:32:07
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
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
Gewijzigd op 11/05/2015 10:35:43 door Ger van Steenderen
 

Pagina: « vorige 1 2



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.