Ik ben bezig om een overzicht te maken van uitslagen van spelers uit het verleden. Ik sorteer zodat de recentste editie als eerste komt, maar spelers die geen uitslag hebben (NULL) komen nog bovenaan. Ik heb al gezocht hoe ik dat zou moeten veranderen, maar op de één of andere manier werkt dat allemaal niet.

SELECT voornaam, achternaam, tussenvoegsel, id, land, uitslag_positie,

MAX(IF(uitslag_seizoen = "14-15", uitslag_positie, 1)) AS s1,
MAX(IF(uitslag_seizoen = "13-14", uitslag_positie, NULL)) AS s2,
MAX(IF(uitslag_seizoen = "12-13", uitslag_positie, NULL)) AS s3,
MAX(IF(uitslag_seizoen = "11-12", uitslag_positie, NULL)) AS s4,
MAX(IF(uitslag_seizoen = "10-11", uitslag_positie, NULL)) AS s5,
MAX(IF(uitslag_seizoen = "09-10", uitslag_positie, NULL)) AS s6,
MAX(IF(uitslag_seizoen = "08-09", uitslag_positie, NULL)) AS s7

FROM speler AS s
JOIN uitslagen AS u ON s.id = u.uitslag_naam
JOIN kalender AS k ON u.uitslag_wedstrijd_id = k.kalender_id AND u.uitslag_categorie = k.categorie AND u.uitslag_seizoen = k.seizoen

GROUP BY id
ORDER BY s1 ASC, s2 ASC, s3 ASC, s4 ASC, s5 ASC, s6 ASC, s7 ASC
Toch werkt dat in dit geval niet. Als ik een streepje toevoeg werkt hij niet meer, en als ik hem weg haal wel weer.
Wat werkt er dan niet meer?

SELECT * FROM
(SELECT
	'Jan R' naam, NULL w1, 2 w2, 5 w3, 6 w4
UNION
SELECT 'Ger', 1, NULL, 3, 4
UNION
SELECT 'G Jansma', 1, 1, 4, 3
UNION
SELECT 'PHP Hulp', NULL, NULL, NULL, NULL
) s
ORDER BY -w1 DESC, -w2 DESC, -w3 DESC, -w4 DESC

+ --------- + ------- + ------- + ------- + ------- +
| naam      | w1      | w2      | w3      | w4      |
+ --------- + ------- + ------- + ------- + ------- +
| G Jansma  | 1       | 1       | 4       | 3       |
| Ger       | 1       |         | 3       | 4       |
| Jan R     |         | 2       | 5       | 6       |
| PHP Hulp  |         |         |         |         |
+ --------- + ------- + ------- + ------- + ------- +

Getest met Mysql 5.5 en 5.6
Maar wat gebeurt er als je ordent op -naam? Een string kun je niet negatief maken, dus ik heb het idee dat hij daarover zou struikelen. En dat is dan ook wat er bij TS aan de hand is.
Ik heb even een SQL Fiddle gemaakt met een conceptje.

http://sqlfiddle.com/#!9/f62c5/1

Als ik er -s1 DESC van maak dan geeft hij als fout: 'Reference 's1' not supported (reference to group function)'.

Als ik de Max weghaal en sorteer op -s1 DESC dan zet hij wel de NULLs onderaan, maar dan werkt het niet meer zoals ik zou willen. Kennelijk zit daar dus het probleem.
Haal dan eens je order by in een extra SQL:

SELECT * FROM 
(
  SELECT voornaam, achternaam, tussenvoegsel, id, land, uitslag_positie,

  MAX(IF(uitslag_seizoen = "14-15", uitslag_positie, 1)) AS s1,
  MAX(IF(uitslag_seizoen = "13-14", uitslag_positie, NULL)) AS s2,
  MAX(IF(uitslag_seizoen = "12-13", uitslag_positie, NULL)) AS s3,
  MAX(IF(uitslag_seizoen = "11-12", uitslag_positie, NULL)) AS s4,
  MAX(IF(uitslag_seizoen = "10-11", uitslag_positie, NULL)) AS s5,
  MAX(IF(uitslag_seizoen = "09-10", uitslag_positie, NULL)) AS s6,
  MAX(IF(uitslag_seizoen = "08-09", uitslag_positie, NULL)) AS s7

  FROM speler AS s
  JOIN uitslagen AS u ON s.id = u.uitslag_naam
  JOIN kalender AS k ON u.uitslag_wedstrijd_id = k.kalender_id AND u.uitslag_categorie = k.categorie AND   u.uitslag_seizoen = k.seizoen

  GROUP BY id
)
ORDER BY -s1 DESC, -s2 DESC, -s3 DESC, -s4 DESC, -s5 DESC, -s6 DESC, -s7 DESC


Overigens is het niet netjes om GROUP BY op alleen id te doen, beter zou zijn voornaam, achternaam, tussenvoegsel, id, land, uitslag_positie
Kijk aan, dat werkt! Bedankt voor de hulp!

Reageren