Stand maken met Mysql

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 volgende »

G Jansma

G Jansma

03/12/2015 18:36:58
Quote Anchor link
Niet afhaken svp, ik heb al super veel gehad aan je feedback.

Dat van de laatste editie is ook niet direct prioriteit.

Ik zal het nog een keer proberen: Ik wil alle punten van een speler, bv van Jan, optellen. Bestaande uit alle N1 en N2, en de beste vijf resultaten van N3 en N4. En dat alles uit het afgelopen jaar. Mocht binnen dat jaar een wedstrijd vaker dan 1x hebben plaatsgevonden dan telt alleen die laatste editie mee bij de punten van Jan (indien N1 of N2, of bij de beste resultaten van N3 en N4). De punten van een wedstrijd vervallen dus na 365 dagen, of nadat de wedstrijd weer is verreden.

Maar dat is eigenlijk voor later zorg. Ik zal eerst eens proberen om dat met die Union en N3 en N4 te fixen.
Gewijzigd op 03/12/2015 18:41:42 door G Jansma
 
PHP hulp

PHP hulp

26/04/2024 22:26:42
 
Jan de Laet

Jan de Laet

03/12/2015 18:50:01
Quote Anchor link
Oke, nog 1 poging dan.

Hoe kan ik aan jouw data zien dat wedstrijden dezelfde wedstrijden zijn, maar andere andere edities?
 
G Jansma

G Jansma

03/12/2015 18:54:03
Quote Anchor link
Ik denk dat ik dat met die datum trouwens wel kan opvangen als ik aan de kalender rij een 'vervaldatum' toevoeg. Dan zou ik kunnen selecteren op $datum between datum AND vervaldatum.
Gewijzigd op 03/12/2015 18:55:15 door G Jansma
 
Jan de Laet

Jan de Laet

03/12/2015 19:01:25
Quote Anchor link
Is begrijp waar je heen wilt. Als er een nieuwe editie is van een wedstrijd zet je bij de vorige editie de vervaldatum. Ik zou zelf kiezen voor een simpel actief J/N vlaggetje.
En dan werken met alle wedstrijden die actief = J hebben.
 
G Jansma

G Jansma

03/12/2015 23:48:58
Quote Anchor link
Ik krijg het nog niet voor elkaar met die 'Union'. Hoe zou ik dat moeten doen? Ik ben even uitgegaan van het begin, en onderstaande subquery is me gelukt, maar hoe zou ik bij wijze van test uitslag_positie 4,5,6 kunnen verenigen dmv een Union?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
$sql =
"SELECT uitslag_naam, SUM(punten) AS punt FROM

(SELECT * FROM uitslagen
WHERE uitslag_positie IN ('1','2','3')) AS u2

GROUP BY uitslag_naam
ORDER BY SUM(punten) DESC"
 
Jan de Laet

Jan de Laet

04/12/2015 08:18:18
Quote Anchor link
Om op je laatste vraag in te gaan: Verderop leg ik het geheel uit.
Ik bouw het even op in stapjes.

Dit is je basis query:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT uitslag_naam, punten FROM uitslagen WHERE uitslag_positie IN ('1','2','3')


Deze query wil je 2 keer uitvoeren en samenvoegen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT uitslag_naam, punten FROM uitslagen WHERE uitslag_positie IN ('1','2','3')
UNION ALL
SELECT uitslag_naam, punten FROM uitslagen WHERE uitslag_positie IN ('4','5','6')


En het resultaat daarvan wil je groeperen, sorteren en sommeren:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT uitslag_naam, SUM(punten) AS punt FROM
  (hier de subquery)
GROUP BY uitslag_naam
ORDER BY SUM(punten) DESC


Dat wordt dan dus:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
SELECT t.uitslag_naam, SUM(t.punten) AS punt FROM
  (SELECT uitslag_naam, punten FROM uitslagen WHERE uitslag_positie IN ('1','2','3')
   UNION ALL
   SELECT uitslag_naam, punten FROM uitslagen WHERE uitslag_positie IN ('4','5','6')
  ) as t
GROUP BY t.uitslag_naam
ORDER BY SUM(t.punten) DESC


Niet getest, dus misschien moet er hier een daar nog een alias bij (AS xxxx).


Ik denk dat ik ook een oplossing heb voor je N3, N4 probleem. Zie hieronder voor het hele verhaal.

Toevoeging op 04/12/2015 09:13:28:

Het liet me niet los, maar het is niet eenvoudig.
Ik zal stap voor stap proberen uit te leggen wat ik doe.

We hebben alleen interesse in uitslagen van "actieve" wedstrijden (of je dit met een datum of een actief vlag aghandelt maakt niet uit, ik gebruik een actief vlag)

Voorbeeld voor de uitslagen van de N1 wedstrijden
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT u1.uitslag_spelerid, u1.uitslag_punten FROM uitslagen AS u1
JOIN kalender AS k1 ON k1.categorie = u1.uitslag_categorie AND k1.niveau = u1.uitslag_niveau AND k1.seizoen = u1.uitslag_seizoen  
     AND k1.categorie="N1" AND k1.actief = "J" AND k1.datum BETWEEN '".$datum."' - INTERVAL 1 YEAR AND '".$datum."


Hier blijkt al dat het beter was geweest om niet categorie, niveau en seizoen te repliceren in uitslage, maar een link (kalenderid) van kalender naar de wedstrijd op te nemen. Dan zou het er zo uitzien:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT u1.uitslag_spelerid, u1.uitslag_punten FROM uitslagen AS u1
JOIN kalender AS k1 ON k1.id = u1.kalenderid  
     AND k1.categorie="N1" AND k1.actief = "J" AND k1.datum BETWEEN '".$datum."' - INTERVAL 1 YEAR AND '".$datum."


Ditzelfde kunnen we doen voor de N2 wedstrijden.

Voor de N3 en N4 is het lastiger, want dan hebben we per speler de beste 5 resultaten nodig

We moeten eerst per speler de 5 uitslagen vinden met de hoogste punten:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
    set @num := 0, @type := '';
    SELECT u3.uitslag_id FROM (
      SELECT uitslagen.uitslag_id, uitslagen.uitslag_spelerid, uitslagen.uitslag_punten,
            @num := if(@type = TeamID, @num + 1, 1) as row_number,
            @type := TeamId as dummy
      FROM uitslagen
      JOIN kalender AS k3 ON k3.id = uitslagen.kalender_id  
           AND k3.categorie="N3" AND k3.actief = "J" AND k3.datum BETWEEN '".$datum."' - INTERVAL 1 YEAR AND '".$datum."
      ORDER BY uitslagen.uitslag_spelerid, uitslagen.uitslag_punten
    ) as u3
    WHERE u3.row_number<=5


In de binnen SELECT .. FROM .. JOIN .. ORDER BY voeg je velden toe om de plaats te bepalen van de punten per speler. In de buiten SELECT neem je dan alleen de rijen met row_number kleiner gelijk 5.

Dit resultaat (met de unieke uitslag_id per wedstrijd kunnen we gebruiken om net als bij N1 en N2 de uitslag_spelerid, uitslag_punten op te halen voor de uitslagen uit het resultaat.
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
set @num := 0, @type := '';
SELECT r3.uitslag_spelerid, r3,uitslag_punten FROM uitslagen AS r3
WHERE r3.uitslag_id in (
    SELECT u3.uitslag_id FROM (
      SELECT uitslagen.uitslag_id, uitslagen.uitslag_spelerid, uitslagen.uitslag_punten,
            @num := if(@type = TeamID, @num + 1, 1) as row_number,
            @type := TeamId as dummy
      FROM uitslagen
      JOIN kalender AS k3 ON k3.id = uitslagen.kalender_id  
           AND k3.categorie="N3" AND k3.actief = "J" AND k3.datum BETWEEN '".$datum."' - INTERVAL 1 YEAR AND '".$datum."
      ORDER BY uitslagen.uitslag_spelerid, uitslagen.uitslag_punten
    ) as u3
    WHERE u3.row_number<=5
)


Dit zelfde doen we voor N4.
En dan voegen we alles samen.
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
set @num := 0, @type := '';
-- N1
SELECT u1.uitslag_spelerid, u1.uitslag_punten FROM uitslagen AS u1
JOIN kalender AS k1 ON k1.id = u1.kalenderid  
     AND k1.categorie="N1" AND k1.actief = "J" AND k1.datum BETWEEN '".$datum."' - INTERVAL 1 YEAR AND '".$datum."
-- N2
UNION ALL
SELECT u2.uitslag_spelerid, u2.uitslag_punten FROM uitslagen AS u2
JOIN kalender AS k2 ON k2.id = u2.kalenderid  
     AND k2.categorie="N2" AND k2.actief = "J" AND k2.datum BETWEEN '".$datum."' - INTERVAL 1 YEAR AND '".$datum."
-- N3
UNION ALL
SELECT r3.uitslag_spelerid, r3,uitslag_punten FROM uitslagen AS r3
WHERE r3.uitslag_id in (
    SELECT u3.uitslag_id FROM (
      SELECT uitslagen.uitslag_id, uitslagen.uitslag_spelerid, uitslagen.uitslag_punten,
            @num := if(@type = TeamID, @num + 1, 1) as row_number,
            @type := TeamId as dummy
      FROM uitslagen
      JOIN kalender AS k3 ON k3.id = uitslagen.kalender_id  
           AND k3.categorie="N3" AND k3.actief = "J" AND k3.datum BETWEEN '".$datum."' - INTERVAL 1 YEAR AND '".$datum."
      ORDER BY uitslagen.uitslag_spelerid, uitslagen.uitslag_punten
    ) as u3
    WHERE u3.row_number<=5
)
-- N3
UNION ALL
SELECT r4.uitslag_spelerid, r4,uitslag_punten FROM uitslagen AS r4
WHERE r4.uitslag_id in (
    SELECT u4.uitslag_id FROM (
      SELECT uitslagen.uitslag_id, uitslagen.uitslag_spelerid, uitslagen.uitslag_punten,
            @num := if(@type = TeamID, @num + 1, 1) as row_number,
            @type := TeamId as dummy
      FROM uitslagen
      JOIN kalender AS k4 ON k4.id = uitslagen.kalender_id  
           AND k4.categorie="N4" AND k4.actief = "J" AND k4.datum BETWEEN '".$datum."' - INTERVAL 1 YEAR AND '".$datum."
      ORDER BY uitslagen.uitslag_spelerid, uitslagen.uitslag_punten
    ) as u4
    WHERE u4.row_number<=5
)


En over dit alles gooien we dan de SUM, GROUP BY en ORDER BY, Tevens halen we de spelersnaam op als deze niet in uitslagen zit maar in
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
set @num := 0, @type := '';
SELECT s.naam, SUM(t.punten) AS punt FROM

    (
    -- N1
    SELECT u1.uitslag_spelerid, u1.uitslag_punten FROM uitslagen AS u1
    JOIN kalender AS k1 ON k1.id = u1.kalenderid  
         AND k1.categorie="N1" AND k1.actief = "J" AND k1.datum BETWEEN '".$datum."' - INTERVAL 1 YEAR AND '".$datum."
    -- N2
    UNION ALL
    SELECT u2.uitslag_spelerid, u2.uitslag_punten FROM uitslagen AS u2
    JOIN kalender AS k2 ON k2.id = u2.kalenderid  
         AND k2.categorie="N2" AND k2.actief = "J" AND k2.datum BETWEEN '".$datum."' - INTERVAL 1 YEAR AND '".$datum."
    -- N3
    UNION ALL
    SELECT r3.uitslag_spelerid, r3,uitslag_punten FROM uitslagen AS r3
    WHERE r3.uitslag_id in (
        SELECT u3.uitslag_id FROM (
          SELECT uitslagen.uitslag_id, uitslagen.uitslag_spelerid, uitslagen.uitslag_punten,
                @num := if(@type = TeamID, @num + 1, 1) as row_number,
                @type := TeamId as dummy
          FROM uitslagen
          JOIN kalender AS k3 ON k3.id = uitslagen.kalender_id  
               AND k3.categorie="N3" AND k3.actief = "J" AND k3.datum BETWEEN '".$datum."' - INTERVAL 1 YEAR AND '".$datum."
          ORDER BY uitslagen.uitslag_spelerid, uitslagen.uitslag_punten
        ) as u3
        WHERE u3.row_number<=5
    )
    -- N4
    UNION ALL
    SELECT r4.uitslag_spelerid, r4,uitslag_punten FROM uitslagen AS r4
    WHERE r4.uitslag_id in (
        SELECT u4.uitslag_id FROM (
          SELECT uitslagen.uitslag_id, uitslagen.uitslag_spelerid, uitslagen.uitslag_punten,
                @num := if(@type = TeamID, @num + 1, 1) as row_number,
                @type := TeamId as dummy
          FROM uitslagen
          JOIN kalender AS k4 ON k4.id = uitslagen.kalender_id  
               AND k4.categorie="N4" AND k4.actief = "J" AND k4.datum BETWEEN '".$datum."' - INTERVAL 1 YEAR AND '".$datum."
          ORDER BY uitslagen.uitslag_spelerid, uitslagen.uitslag_punten
        ) as u4
        WHERE u4.row_number<=5
    ) as t

)
JOIN spelers AS s ON s.id=t.spelerid
GROUP BY s.naam
ORDER BY SUM(t.punten) DESC



Dit overziend denk ik dat het makkelijker en overzichtelijker is om dit niet zo te doen, maar in het script waar je ook de punten bepaald. Dan bouw je het in stukjes op. Dat zou ik zelf tenminste doen.

Ik hoop dat het een beetje klopt. Uit de losse pols ingetikt en dus zitten er misschien hier en daar nog foutjes in. In ieder geval in de namen van tabellen en velden.
Test het uit in stukjes zoals ik het beschrijf en bouw het zo langzaam verder op.
Gewijzigd op 04/12/2015 09:19:16 door Jan de Laet
 
G Jansma

G Jansma

04/12/2015 17:13:09
Quote Anchor link
Laat ik je eerst nogmaals bedanken voor de hulp! De Union is me inmiddels gelukt. Ik heb voor het gemak en het overzicht maar even de ballast van de datum eruit gehaald. Prioriteit is hoe ik de beste 5 kan selecteren.

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
"SELECT t.uitslag_naam, SUM(t.punten) AS punt FROM

  (SELECT uitslag_naam, punten FROM uitslagen AS u
   JOIN kalender AS k ON k.kalender_id = u.uitslag_id AND k.categorie = u.uitslag_categorie AND k.seizoen = u.uitslag_seizoen
   WHERE uitslag_categorie = 'A' AND niveau IN ('N1')
  
   UNION ALL
  
   SELECT uitslag_naam, punten FROM uitslagen AS u
   JOIN kalender AS k ON k.kalender_id = u.uitslag_id AND k.categorie = u.uitslag_categorie AND k.seizoen = u.uitslag_seizoen
   WHERE uitslag_categorie = 'A' AND niveau IN ('N2')
   )  
   as t

WHERE punten > 0
GROUP BY t.uitslag_naam
ORDER BY SUM(t.punten) DESC";


Alleen die N3 en N4 zijn dus nog niet gelukt. Ik heb even wat namen gewijzigd, want die waren niet allemaal goed. (er stond ook een , achter r3.punten). Het zou dan dit worden, ik heb Join maar even overgenomen en in jouw stijl gezet. Hoef je uitslagen niet 'aan te kondigen' dmv AS uitslagen, omdat je uitslagen. gebruikt?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT r3.uitslag_naam, r3.punten FROM uitslagen AS r3
WHERE r3.uitslag_id in (
    SELECT u3.uitslag_id FROM (
      SELECT uitslagen.uitslag_id, uitslagen.uitslag_naam, uitslagen.punten,
            @num := if(@type = TeamID, @num + 1, 1) as row_number,
            @type := TeamId as dummy
      FROM uitslagen
      JOIN kalender AS k3 ON k3.kalender_id = uitslagen.uitslag_id AND k3.categorie = uitslagen.uitslag_categorie AND k3.seizoen = uitslagen.uitslag_seizoen  
      AND k3.niveau='N3'
      ORDER BY uitslagen.uitslag_naam, uitslagen.punten
    ) as u3
    WHERE u3.row_number<=5
)


En ik had nog een vraagje over:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
set @num := 0, @type := '';


Ik begrijp dat dat vooraan moet staan in de query? Ik heb het als test vooraan gezet in de huidige query met de Union (met N1 en N2), maar dan werkt het al niet meer. Is dat logisch, of zit daar misschien iets in fout?

Ik denk dat het het beste is om eerst alleen de 5 beste resultaten van N3 werkend te krijgen en vervolgens in de Union te verwerken?
 
Jan de Laet

Jan de Laet

05/12/2015 13:31:16
Quote Anchor link
Mooi dat de UNION is gelukt.
Ik denk dat de WHERE punten>0 niet hoeft want je toont alleen de SUM(punten). Of moet zijn dat je de namen met 0 punten in totaal niet wilt zien, maar dan moet je tussen GROUP BY en ORDER BY, dit plaatsen HAVING SUM(punten)>0. De HAVING is een soort WHERE maar dan op het groepsresultaat.


VWb 5 beste wedstrijden: Probeer het eens in stapjes (zie opmerking onderaan over gebruik van SET.

1. Lukt het om de uitslagen op volgorde van beste uitslag te krijgen? Ik zie nu dat er na uitslagen.punten nog DESC moet komen
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
SET @num := 0, @type := '';

      SELECT uitslagen.uitslag_id, uitslagen.uitslag_naam, uitslagen.punten,
            @num := if(@type = uitslag_naam, @num + 1, 1) as row_number,
            @type := uitslag_naam as dummy
      FROM uitslagen
      JOIN kalender AS k3 ON k3.kalender_id = uitslagen.uitslag_id AND k3.categorie = uitslagen.uitslag_categorie
           AND k3.seizoen = uitslagen.uitslag_seizoen AND k3.niveau='N3'
      ORDER BY uitslagen.uitslag_naam, uitslagen.punten DESC;


2. Lukt het om van de beste 5, alleen de uitslag_id te krijgen
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
SET @num := 0, @type := '';

   SELECT u3.uitslag_id FROM (
      SELECT uitslagen.uitslag_id, uitslagen.uitslag_naam, uitslagen.punten,
            @num := if(@type = uitslag_naam, @num + 1, 1) as row_number,
            @type := uitslag_naam as dummy
      FROM uitslagen
      JOIN kalender AS k3 ON k3.kalender_id = uitslagen.uitslag_id AND k3.categorie = uitslagen.uitslag_categorie
           AND k3.seizoen = uitslagen.uitslag_seizoen AND k3.niveau='N3'
      ORDER BY uitslagen.uitslag_naam, uitslagen.punten DESC
    ) as u3
    WHERE u3.row_number<=5;


3. Lukt het van de beste 5 de benodigde gegevens uit uitslagen te halen
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
SET @num := 0, @type := '';

SELECT r3.uitslag_naam, r3.punten FROM uitslagen AS r3
WHERE r3.uitslag_id in (
   SELECT u3.uitslag_id FROM (
      SELECT uitslagen.uitslag_id, uitslagen.uitslag_naam, uitslagen.punten,
            @num := if(@type = uitslag_naam, @num + 1, 1) as row_number,
            @type := uitslag_naam as dummy
      FROM uitslagen
      JOIN kalender AS k3 ON k3.kalender_id = uitslagen.uitslag_id AND k3.categorie = uitslagen.uitslag_categorie
           AND k3.seizoen = uitslagen.uitslag_seizoen AND k3.niveau='N3'
      ORDER BY uitslagen.uitslag_naam, uitslagen.punten DESC
    ) as u3
    WHERE u3.row_number<=5
);



Misschien kan het zelfs wat korter, probeer dit eens:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
SET @num := 0, @type := '';

SELECT u3.uitslag_naam, u3.punten FROM (
    SELECT uitslagen.uitslag_naam, uitslagen.punten,
           @num := if(@type = uitslag_naam, @num + 1, 1) as row_number,
           @type := uitslag_naam as dummy
    FROM uitslagen
    JOIN kalender AS k3 ON k3.kalender_id = uitslagen.uitslag_id AND k3.categorie = uitslagen.uitslag_categorie
         AND k3.seizoen = uitslagen.uitslag_seizoen AND k3.niveau='N3'
    ORDER BY uitslagen.uitslag_naam, uitslagen.punten DESC
) as u3
WHERE u3.row_number<=5


Vwb gebruik SET.
Ik heb zelf nog nooit gewerkt met de set. Ik heb gezocht op internet en het lijkt dat je niet 2 statements tegelijk kunt uitvoeren. Dus probeer te splitsen, eerst query met SET @num := 0, @type := ''; en dan query met de SELECT ...

Als iets niet werkt hoor ik graag de foutmelding en de sql zoals je die gebruikte.



Toevoeging op 05/12/2015 16:10:59:

Nog een vraag: in de JOIN gebruik je
JOIN kalender AS k3 ON k3.kalender_id = uitslagen.uitslag_id AND k3.categorie = uitslagen.uitslag_categorie
AND k3.seizoen = uitslagen.uitslag_seizoen AND k3.niveau='N3'

Als je al op k3.kalender_id = uitslagen.uitslag_id kun selecteren, zijn de andere velden (categorie, seizoen en niveau) dan nog wel nodig?
Gewijzigd op 05/12/2015 19:35:50 door Jan de Laet
 
G Jansma

G Jansma

05/12/2015 17:32:57
Quote Anchor link
Ik heb van alles geprobeerd, en de code verkleind tot onderstaande, maar krijg constant een error. Altijd direct na de SET.

Error description: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT * FROM uitslagen' at line 3

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
$sql =
"set @num := 0, @type := '';

SELECT * FROM uitslagen";


Hoe zou dat dan eruit moeten zien met meerdere queries?
 
Jan de Laet

Jan de Laet

05/12/2015 17:54:33
Quote Anchor link
2 keer de sql uitvoeren.
dus:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$sql1
= "set @num := 0, @type := '';"
$sql2 = "SELECT * FROM uitslagen";
?>

en die allebei uitvoeren met $sql1 en $sql2

NB ik heb in de post van 13:31 TeamID nog vervangen door uitslag_naam. TeamID was van mijn eigen test tabel.

Toevoeging op 06/12/2015 13:14:57:

Vergeet (bijna) alles was ik hierboven heb gezegd over N3 en N4 uitslagen. Het blijkt dat @num niet werkt als er ook een JOIN gebruikt wordt.

Dit werkt wel voor N3 en N4. Ik heb geprobeerd jouw tabellen en data na te bouwen en dan geeft dit het goede resultaat om in de UNIONs te gebruiken:
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
<?php
        $sql
= "SET @num := 0, @type := ''";
        $query = $this->db->prepare($sql);
        $query->execute();
        
        $sql = "
        SELECT uitslag_naam, punten FROM (
            SELECT (SELECT COUNT(cu.uitslag_naam)
                FROM uitslagen AS cu
                JOIN kalender AS ck ON ck.kalender_id = cu.uitslag_id
                    AND ck.categorie = cu.uitslag_categorie
                    AND ck.seizoen = cu.uitslag_seizoen
                    AND ck.niveau = 'N3'
                WHERE cu.uitslag_naam = r3.uitslag_naam AND cu.punten >= r3.punten) AS rank,
                id,
                uitslag_naam,
                punten
            FROM uitslagen AS r3
            JOIN kalender AS k3 ON k3.kalender_id = r3.uitslag_id
                AND k3.categorie = r3.uitslag_categorie
                AND k3.seizoen = r3.uitslag_seizoen
                AND k3.niveau = 'N3'
            ORDER BY uitslag_naam, rank
        ) as u3
        WHERE u3.rank<=5
        ORDER BY uitslag_naam, rank"
;
        $query = $this->db->prepare($sql);
        $query->execute();
?>


En kijk nog eens goed hoe je uitslagen met kalender JOINed. Volgens mij is uitslag_id voldoende en heb je de andere velden dan niet nodig. maar ik ken dus jouw data niet precies.
Gewijzigd op 05/12/2015 20:00:36 door Jan de Laet
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

06/12/2015 17:33:11
Quote Anchor link
Het is inderdaad zo dat het nummeren van de rijen op de manier zoals jij het deed niet werkt in combinatie met een join, het is niet eens gegarandeerd dat het zonder join wel zou werken.

Omdat het rijnummer hier alleen gebruikt wordt om op te filteren, kan je dit toekennen in de WHERE:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT
    r3.uitslag_naam, r3.punten
    FROM
        (
        SELECT u3.uitslag_naam, u3.punten
        FROM uitslagen u3
        JOIN kalender k3
            ON k3.kalender_id = u3.uitslag_id AND k3.categorie = u3.uitslag_categorie
               AND k3.seizoen = u3.uitslag_seizoen AND k3.niveau='N3'
        ORDER BY u3.uitslag_naam, u3.punten DESC
        ) r3
        CROSS JOIN (SELECT @num := 0, @naam := '') v3
        WHERE @num := IF(@naam = @naam := r3.uitslag_naam, @num + 1, 1) <= 5

Als alternatief voor de afzonderlijke SET query heb ik de user variabelen geset in een cross join
Gewijzigd op 06/12/2015 17:36:00 door Ger van Steenderen
 
G Jansma

G Jansma

06/12/2015 20:45:57
Quote Anchor link
Ik denk dat we ons maar even moeten beperken tot het hoogst noodzakelijke. Het gaat natuurlijk vooral om het principe hoe we een X aantal resultaten kunnen krijgen. De Join, Order By, Group By etc kan er altijd nog in, maar voor het overzicht vind ik het (en jullie vast ook) nogal verwarrend.

@Jan: Ik krijg jouw code helaas niet werkend.

@Ger: Jouw code werkt op zich, maar geeft gewoon alle resultaten, niet alleen de beste 5 voor elke speler.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
$sql = "SELECT * FROM

        (
        
        SELECT u3.uitslag_naam, u3.punten
        FROM uitslagen u3
        WHERE u3.uitslag_categorie = 'A'
        ORDER BY u3.uitslag_naam, u3.punten DESC
        
        ) r3
      
    CROSS JOIN (SELECT @num := 0, @naam := '') v3
        WHERE @num := IF(@naam = @naam := r3.uitslag_naam, @num + 1, 1) <= 5";


Ik durf het bijna niet te vragen, maar zouden jullie misschien zelf misschien kunnen testen met onderstaande sql dump? Ik heb even wat rijen gemaakt met id, categorie en punten met voor elk id 5 resultaten. Alvast bedankt!

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
Tabelstructuur voor tabel `test`
--

CREATE TABLE `test` (
  `id` int(11) NOT NULL,
  `categorie` varchar(11) NOT NULL,
  `punten` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Gegevens worden gexporteerd voor tabel `test`
--

INSERT INTO `test` (`id`, `categorie`, `punten`) VALUES
(1, 'A', 20),
(1, 'A', 18),
(1, 'A', 16),
(1, 'A', 4),
(1, 'A', 2),
(2, 'A', 14),
(2, 'A', 8),
(2, 'A', 6),
(2, 'A', 10),
(2, 'A', 12),
(3, 'A', 18),
(3, 'A', 10),
(3, 'A', 4),
(3, 'A', 20),
(3, 'A', 2);

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
Gewijzigd op 06/12/2015 20:51:12 door G Jansma
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

06/12/2015 23:29:57
Quote Anchor link
Ik ben iets te snel geweest, er moet nog een extra select omheen:
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
SELECT n3.uitslag_naam, n3.punten
FROM
    (
    SELECT
        r3.uitslag_naam, r3.punten,
        @num := IF(@naam = r3.uitslag_naam, @num + 1, 1) rownum,
        @naam := r3.uitslag_naam
    FROM
        (
        SELECT u3.uitslag_naam, u3.punten
        FROM uitslagen u3
        JOIN kalender k3
            ON k3.kalender_id = u3.uitslag_id AND k3.categorie = u3.uitslag_categorie
               AND k3.seizoen = u3.uitslag_seizoen AND k3.niveau='N3'
        ORDER BY u3.uitslag_naam, u3.punten DESC
        ) r3
        CROSS JOIN (SELECT @num := 0, @naam := '') v3
     ) n3
WHERE  rownum <= 5

Met jou data een SQL Fiddle gemaakt.
 
G Jansma

G Jansma

07/12/2015 09:40:05
Quote Anchor link
Die SQL-fiddle is erg hoopgevend, maar toch lukt het me niet om de juiste output te krijgen. Ik krijg namelijk gewoon alle 5 de resultaten, in plaats van 3. Misschien doe ik iets heel doms, maar ik neem aan dat ik toch gewoon {$row['punten']} kan aanroepen?

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
$sql2 = "
SELECT id, punten
FROM
  (SELECT id, punten,
     @num := IF(@id = id, @num +1, 1) rownum,
     @id := id
   FROM
     (SELECT id, punten
      FROM test
      ORDER BY id, punten DESC) t1
   CROSS JOIN (SELECT @num:= 0, @id = 0) v1
   ) t2
   WHERE rownum <= 3";

$result = mysqli_query($con, $sql2);

    while($row = mysqli_fetch_array($result))    
    {echo "{$row['id']} {$row['punten']}<br>";}
 
Jan de Laet

Jan de Laet

07/12/2015 13:43:48
Quote Anchor link
De waarde bij rownum <= 3 bepaalt hoeveel rijen (met punten) je krijgt voor elke id (de beste 3).
Ik neem aan dat Ger 3 gebruikt heeft omdat er maar 5 resultaten per id waren in jouw voorbeeld data.

Het resultaat van Ger ga je later JOINEN met de punten van N1, N2 en N4 en sommeren per id, zoals al eerder besproken.
Gewijzigd op 07/12/2015 13:59:37 door Jan de Laet
 
G Jansma

G Jansma

07/12/2015 13:56:10
Quote Anchor link
Jan de Laet op 07/12/2015 13:43:48:
De waarde op regel 3 bepaalt hoeveel rijen (met punten) je krijgt voor elke id (de beste 3).
Ik neem aan dat Ger 3 gebruikt heeft omdat er maar 5 resultaten per id waren in jouw voorbeeld data.

Het resultaat van Ger ga je later JOINEN met de punten van N1, N2 en N4 en sommeren per id, zoals al eerder besproken.


Dit is meer als test bedoeld. Maar als ik daarin niet de juiste output krijg dan werkt het in een join ook niet lijkt me. Bij die SQL Fiddle geeft hij namelijk 3 resultaten per ID, maar als ik dat in een php-pagina zet dan krijg ik alle 5 de resultaten per ID.
 
Jan de Laet

Jan de Laet

07/12/2015 14:38:23
Quote Anchor link
Ik heb het aan mij kant ook geprobeerd en krijg ook alle resultaten ipv 3 per id.
Het lijkt erop alsof rownum altijd 1 is.

Misschien is het beter om je aanpak te veranderen en een aantal sql's uit te voeren en de resultaten in een standen tabel te zetten.
Voor de N3 en N4 resultaten heb je wat code nodig om per id/naam alleen de beste 5 naar de standen tabel te schrijven.
Die tabel standen kun dan gebruiken om weer te geven.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

07/12/2015 15:02:00
Quote Anchor link
Vreemd dat het op SQL fiddle wel werkt want er staat een klein (maar belangrijk) foutje in de query.
Het moet namelijk zijn @id := 0
 
Jan de Laet

Jan de Laet

07/12/2015 15:53:25
Quote Anchor link
@Ger, als ik jou SQLfiddle toe pas in mijn phpAdmin, dan krijg ik (na correctie van @id:=0) de 1e 3 van elk id en niet de beste 3.
Gewijzigd op 07/12/2015 17:00:04 door Jan de Laet
 
G Jansma

G Jansma

07/12/2015 18:25:32
Quote Anchor link
Bij mij werkt het, helemaal super! Enorm bedankt Jan en Ger!
 

Pagina: « vorige 1 2 3 volgende »



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.