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
1. order by toevoegen: veldnaam is not null desc
2. ipv null in de if een waarde hoger dan max mogelijks of lager dan min mogelijk naar gelang de veldmogelijkheden

Jan
1. Als ik er alleen 'ORDER BY s1 IS NOT NULL DESC' van maak dan werkt het niet meer.

2. Als ik er 1000 van maak dan schrijft hij ook andere resultaten over. Als ik er -1 van maak werkt dat wel, maar dan staat de -1 nog altijd bovenaan.
G Jansma op 03/01/2016 10:04:17

1. Als ik er alleen 'ORDER BY s1 IS NOT NULL DESC' van maak dan werkt het niet meer.

2. Als ik er 1000 van maak dan schrijft hij ook andere resultaten over. Als ik er -1 van maak werkt dat wel, maar dan staat de -1 nog altijd bovenaan.


Extra sorteren vereist wel een komma:)
In je query staat:

MAX(IF(uitslag_seizoen = "14-15", uitslag_positie, 1)) AS s1

Dus je selecteert geen NULL maar 1 als het seizoen niet '14-15' is.

Overigens is het niet verstandig om dubbele aanhalingstekens te gebruiken voor strings.
Een simpele instelling in MySQL kan al tot gevolg hebben dat je een syntax error om je oren krijgt.
In standaard SQL zijn dubbele aanhalingstekens bedoeld voor het (eventueel) aangeven van identifiers (tabel-, kolomnamen etc.)
Die 1 was een slordigheidsfoutje, die had ik inmiddels vervangen door NULL. Dat van die aanhalingstekens zal ik aanpassen, bedankt voor de tip.

@Jan R: Ik heb de ORDER BY uit de eerste post helemaal vervangen door ORDER BY s1 IS NOT NULL DESC, daar mis ik toch geen komma in?
G Jansma op 02/01/2016 14:17:27

Ik sorteer zodat de recentste editie als eerste komt, maar spelers die geen uitslag hebben (NULL) komen nog bovenaan.

Wat versta je onder de recenste editie, dat is toch 14-15?
Dat is ook wat je nu doet in de query,s1 staat als eerste in de ORDER BY dus daar wordt als eerste op gesoorteerd, zijn de waardes gelijk dan wordt er op s2 gesorteerd, enzovoort.
Is dat niet wat je wilt?
Wat je zegt klopt inderdaad precies. Het probleem is alleen dat er spelers zijn die bijvoorbeeld in 13-14 (s2) een uitslag hebben, maar in 14-15 niet, daardoor bij s1 NULL krijgen. Vervolgens komen zij dan bovenaan bij het sorteren, boven degenen die wel een resultaat hebben bij s1.
Maar dan begrijp ik niet wat er dan niet werkt aan de oplossing uit de link naar SO van Jan (de Laet).
Want als je dit doet:

ORDER BY -s1 DESC, -s2 DESC

Dan krijg je de NULLs gewoon onderaan.

Reageren