Voor een grote website ben ik aan het kijken of er wat geoptimaliseerd kan worden met betrekking tot het vertalen van velden en teksten. Eerst even de twee tabellen uiteen zetten.
Ik wil nu van elke strings.string_id één terughebben (dus GROUP BY string_id), maar dan wel als het kan eerst degene met language_id 2 en anders language_id 3. Mochten die er allebei niet zijn, moet een willekeurige andere uitgekozen worden.
Tot nu toe heb ik dit opgelost door gewoon alles op te halen en via PHP met een mooie loop bovenstaande uitgevoerd. Dit wordt echter veel te langzaam (denk aan 10.000+ rijen) dus ik vraag me af of het niet ook met MySQL zelf mogelijk is.
In het ideale geval zou een query er volgens mij zo uit moeten zien:
Op onderstaande manier heb ik het geprobeerd met Jip-en-Janneke-code, maar dan pikt die steeds de string_id met de laagste language_id uit, ook al zet je eerst een andere language_id voorop:
Dit gaf dus bij string_id's waar je als language_id's 1, 2 en 3 hebt dus standaard degene met de waarde 1 terug in plaats van 2 of 3 als die er ook waren.
Iets anders wat ik heb geprobeerd is met UNION SELECT eerst alles zo te sorteren dat de language_id's die ik hebben wilde bovenaan stonden en dan daarna met GROUP BY string_id de bovenste juiste resultaten gepakt. Maarrrrrr, de server met de website heeft UNION SELECT uitgeschakeld staan om mogelijke SQL-inject gevaren af te wenden dus dat feest gaat niet door.
Weet iemand hoe ik dit probleem met MySQL kan oplossen?
[b][u]LANGUAGES[/u][/b] [b][u]language_id[/u][/b] [b][u]language_name[/u][/b] 1 Nederlands 2 Engels 3 Frans 4 Duits [b][u]STRINGS[/u][/b] [b][u]string_id[/u][/b] [b][u]language_id[/u][/b] [b][u]string_text[/u][/b] 1 3 string_1_frans 1 1 string_1_nederlands 2 4 string_2_duits 3 2 string_3_engels 3 1 string_3_nederlands 3 3 string_3_frans 4 2 string_4_engels 4 4 string_4_duits
Ik wil nu van elke strings.string_id één terughebben (dus GROUP BY string_id), maar dan wel als het kan eerst degene met language_id 2 en anders language_id 3. Mochten die er allebei niet zijn, moet een willekeurige andere uitgekozen worden.
Tot nu toe heb ik dit opgelost door gewoon alles op te halen en via PHP met een mooie loop bovenstaande uitgevoerd. Dit wordt echter veel te langzaam (denk aan 10.000+ rijen) dus ik vraag me af of het niet ook met MySQL zelf mogelijk is.
In het ideale geval zou een query er volgens mij zo uit moeten zien:
SELECT string_id, string_text FROM strings WHERE language_id = FIRST(2, 3, 1, 4)
Op onderstaande manier heb ik het geprobeerd met Jip-en-Janneke-code, maar dan pikt die steeds de string_id met de laagste language_id uit, ook al zet je eerst een andere language_id voorop:
SELECT string_id, string_text
FROM strings
WHERE language_id = 2
OR language_id = 3
OR language_id = 1
OR language_id = 4
GROUP BY string_idDit gaf dus bij string_id's waar je als language_id's 1, 2 en 3 hebt dus standaard degene met de waarde 1 terug in plaats van 2 of 3 als die er ook waren.
Iets anders wat ik heb geprobeerd is met UNION SELECT eerst alles zo te sorteren dat de language_id's die ik hebben wilde bovenaan stonden en dan daarna met GROUP BY string_id de bovenste juiste resultaten gepakt. Maarrrrrr, de server met de website heeft UNION SELECT uitgeschakeld staan om mogelijke SQL-inject gevaren af te wenden dus dat feest gaat niet door.
Weet iemand hoe ik dit probleem met MySQL kan oplossen?