Resultaten NULL onderaan tonen
Quote:
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
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
2. ipv null in de if een waarde hoger dan max mogelijks of lager dan min mogelijk naar gelang de veldmogelijkheden
Jan
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.
http://stackoverflow.com/questions/2051602/mysql-orderby-a-number-nulls-last
De truc zou zijn om te sorteren op ORDER BY -veld DESC
Gewijzigd op 03/01/2016 11:17:50 door Jan de Laet
Jan de Laet op 03/01/2016 11:17:37:
Ik heb het niet geprobeerd, maar kijk hier eens:
http://stackoverflow.com/questions/2051602/mysql-orderby-a-number-nulls-last
De truc zou zijn om te sorteren op ORDER BY -veld DESC
http://stackoverflow.com/questions/2051602/mysql-orderby-a-number-nulls-last
De truc zou zijn om te sorteren op ORDER BY -veld DESC
Ik heb ongeveer alles dat er op Stackoverflow over staat al geprobeerd, maar niks werkt helaas. Dit ook niet.
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.
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:)
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.)
Gewijzigd op 03/01/2016 19:16:24 door Ger van Steenderen
@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.
Want als je dit doet:
Dan krijg je de NULLs gewoon onderaan.
Toch werkt dat in dit geval niet. Als ik een streepje toevoeg werkt hij niet meer, en als ik hem weg haal wel weer.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 | | | | |
+ --------- + ------- + ------- + ------- + ------- +
(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.
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.
Gewijzigd op 08/01/2016 11:18:48 door G Jansma
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
(
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!