okay, så den følgende forespørgsel kan sandsynligvis udføres uden en underforespørgsel, men med en join i stedet. Jeg ville stole på, at forespørgselsoptimeringsværktøjet gør dette, men jeg ville ikke være for sikker.
SELECT l.name as language,
(SELECT cl.name
FROM country_languages cl
WHERE cl.country_id=[the wanted country id]
ORDER BY cl.language_id=l.id DESC,
cl.language_id=1 DESC
LIMIT 1) as country_name
FROM languages l
I denne version bruges language_id 1 som den foretrukne fallback, du kan sandsynligvis tilføje flere sprog på lignende måde. Bruger FIND_IN_SET
i stedet ville et kriterium af anden orden også fungere (FIND_IN_SET(cl.language_id,'1,2,3') DESC
eller hvilken som helst rækkefølge du foretrækker).
Selvfølgelig er denne forespørgsel lige nu for et fast country_id. Det kunne udvides på lignende måde for flere lande med et andet medlem:
SELECT l.name as language,
(SELECT cl.name
FROM country_languages cl
WHERE cl.country_id=c.id
ORDER BY cl.language_id=l.id DESC,
cl.language_id=1 DESC
LIMIT 1) as country_name
FROM countries c
JOIN languages l
et alternativ til underforespørgsler ville være at slutte sig til country_languages to gange, og bare vælge den første, der ikke er null (hvilket sandsynligvis er en af de renere løsninger):
SELECT l.name as language,
COALESCE(first.name, second.name) as country_name
FROM countries c
JOIN languages l
LEFT JOIN country_languages first ON
(first.country_id=c.id AND first.language_id=l.id)
LEFT JOIN country_languages second ON
(second.country_id=c.id AND second.language_id=1)
Hvis sprog-id 1 er dit reservesprog. Dette kan også udvides til at give flere reservesprog ...