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:
SELECT uitslag_naam, punten FROM uitslagen WHERE uitslag_positie IN ('1','2','3')
Deze query wil je 2 keer uitvoeren en samenvoegen:
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:
SELECT uitslag_naam, SUM(punten) AS punt FROM
(hier de subquery)
GROUP BY uitslag_naam
ORDER BY SUM(punten) DESC
Dat wordt dan dus:
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.
[size=xsmall]
Toevoeging op 04/12/2015 09:13:28:[/size]
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
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:
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:
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.
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.
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
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.