Ik heb een database structuur waarbij er een enkele pagina in meerdere talen kan bestaan:
De name + lang is unique. Er is een many:1 relatie met een node. Er kunnen dus meerdere pagina's onder een node hangen. Nu heeft de gebruiker een taal geselecteerd en wil ik alle pagina's van een node selecteren, maar wel binnen die taal. Mocht de taal niet aanwezig zijn, is er altijd een backup taal waarin de pagina verplicht aanwezig is.
Ik deed voorheen (zonder taal-gebeuren):
Ik krijg nu dus wel alle pagina's binnen van een node. Ik heb een GROUP BY name geprobeerd, maar dan neemt hij de ingestelde ORDER BY niet mee. Hoe kan ik, als er dubbele pagina's zijn (dus van meerdere talen) deze groeperen?
Een distinct werkt natuurlijk niet, omdat de rij niet uniek is (de taal is mee geselecteerd). Een group by houdt geen rekening met order by. Er zijn wel meer topics geweest over group by + order by, maar dat ging altijd over "automatische" order by queries. En dit is een beetje een apart geval...
code:
1
2
3
4
5
6
| pages id - int(4) node_id - int(4) name - varchar(255) lang - varchar(4) menu - int(4) |
De name + lang is unique. Er is een many:1 relatie met een node. Er kunnen dus meerdere pagina's onder een node hangen. Nu heeft de gebruiker een taal geselecteerd en wil ik alle pagina's van een node selecteren, maar wel binnen die taal. Mocht de taal niet aanwezig zijn, is er altijd een backup taal waarin de pagina verplicht aanwezig is.
Ik deed voorheen (zonder taal-gebeuren):
SQL:
De naam is gebruikersinput. Nu selecteer ik vervolgens pagina's en sorteer ze manueel (eerst geselecteerde taal, dan backuptaal):1
2
3
4
5
6
| SELECT P.* FROM node_nodes AS N LEFT JOIN node_pages AS P ON N.id=P.node_id WHERE N.name='leuke_pagina_naam' ORDER BY P.menu |
SQL:
Nu krijg ik dus mooi alle pagina's van die node, geselecteerd op eerst de geselecteerde taal (en) en dan de backup taal (nl).1
2
3
4
5
6
7
| SELECT P.* FROM node_nodes AS N LEFT JOIN node_pages AS P ON N.id=P.node_id WHERE N.name='leuke_pagina_naam' AND P.lang in ('en', 'nl') ORDER BY P.menu, P.lang='en' DESC, P.lang='nl' DESC |
Ik krijg nu dus wel alle pagina's binnen van een node. Ik heb een GROUP BY name geprobeerd, maar dan neemt hij de ingestelde ORDER BY niet mee. Hoe kan ik, als er dubbele pagina's zijn (dus van meerdere talen) deze groeperen?
Een distinct werkt natuurlijk niet, omdat de rij niet uniek is (de taal is mee geselecteerd). Een group by houdt geen rekening met order by. Er zijn wel meer topics geweest over group by + order by, maar dat ging altijd over "automatische" order by queries. En dit is een beetje een apart geval...