Vraag over SQL (MySQL). Lastig te verwoorden in een topictitel, maar het probleem is als volgt, beschreven aan de hand van een concreet voorbeeld.
Stel ik heb een tabel met plaatsnamen. Deze zijn gekoppeld aan een plaats. Reden hiervoor is dat een plaats meerdere namen kan hebben. De namen-tabel heeft ook nog een veld status. Hoe hoger de status, hoe belangrijker de naam.
Tabel namen:
Het komt geregeld voor dat ik alle plaatsen wil uitlezen met de belangrijkste naam. Uiteraard alfabetisch gesorteerd.
Hiermee groepeer ik keurig per plaats.
Probleem is echter dat ik dan niet de belangrijkste naam heb. Ik krijg niet de juiste namen, maar een willekeurige naam (uiteraard wel van de plaats) voorgeschoteld.
Dus ik doe:
En dan blijkt er niks van id en naam te kloppen. De maximale status wordt opgevraagd, maar niet de bijbehorende naam.
Dat wordt zichtbaar met deze query:
Ik heb het nog geprobeerd met een WHERE status=MAX(status) , maar dan krijg ik een foutmelding over onjuist gebruik van GROUP BY. Ook een ORDER BY vóór GROUP BY werkt niet. Er zou dus sortering op naam moeten plaats vinden afzonderlijk binnen elke groep (in dit geval alle rijen met dezelfde waarde voor 'plaats').
Ik zou een subquery kunnen doen, zo iets als "WHERE status=(SELECT MAX(status) FROM namen AS t2 WHERE t1.plaats=t2.plaats)" maar dat wil ik niet. Zou ook niet nodig moeten zijn, want het gaat om slechts één tabel en alle benodigde data komt wel een keer langs.
Is er een oplossing zonder subquery's?
Stel ik heb een tabel met plaatsnamen. Deze zijn gekoppeld aan een plaats. Reden hiervoor is dat een plaats meerdere namen kan hebben. De namen-tabel heeft ook nog een veld status. Hoe hoger de status, hoe belangrijker de naam.
Tabel namen:
code:
1
2
3
4
| ID (primary key) Naam VARCHAR(30) Plaats INTEGER (foreign key verwijst naar plaatstabel) Status INTEGER |
Het komt geregeld voor dat ik alle plaatsen wil uitlezen met de belangrijkste naam. Uiteraard alfabetisch gesorteerd.
SQL:
1
2
3
| SELECT id, plaats, status, naam FROM namen GROUP BY plaats |
Hiermee groepeer ik keurig per plaats.
Probleem is echter dat ik dan niet de belangrijkste naam heb. Ik krijg niet de juiste namen, maar een willekeurige naam (uiteraard wel van de plaats) voorgeschoteld.
Dus ik doe:
SQL:
1
2
3
| SELECT plaats, MAX(status), naam FROM namen GROUP BY plaats |
En dan blijkt er niks van id en naam te kloppen. De maximale status wordt opgevraagd, maar niet de bijbehorende naam.
Dat wordt zichtbaar met deze query:
SQL:
1
2
3
| SELECT plaats, MAX(status), status, naam FROM namen GROUP BY plaats |
code:
1
2
3
4
5
6
7
8
9
| +-------------+-------------+--------+----------------+ | plaats | max(status) | status | naam | +-------------+-------------+--------+----------------+ | 11 | 133 | 10 | Testje | 12 | 129 | 129 | Testje | 13 | 129 | 129 | Testje | 14 | 130 | 130 | Testje +-------------+-------------+--------+----------------+ 4 rows in set (0,00 sec) |
Ik heb het nog geprobeerd met een WHERE status=MAX(status) , maar dan krijg ik een foutmelding over onjuist gebruik van GROUP BY. Ook een ORDER BY vóór GROUP BY werkt niet. Er zou dus sortering op naam moeten plaats vinden afzonderlijk binnen elke groep (in dit geval alle rijen met dezelfde waarde voor 'plaats').
Ik zou een subquery kunnen doen, zo iets als "WHERE status=(SELECT MAX(status) FROM namen AS t2 WHERE t1.plaats=t2.plaats)" maar dat wil ik niet. Zou ook niet nodig moeten zijn, want het gaat om slechts één tabel en alle benodigde data komt wel een keer langs.
Is er een oplossing zonder subquery's?