dobře, takže následující dotaz lze pravděpodobně provést bez poddotazu, ale místo toho se spojením. Věřil bych, že to optimalizátor dotazů udělá, ale nebyl bych si tím příliš jistý.
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
V této verzi se jako preferovaná záloha používá language_id 1, pravděpodobně byste mohli podobným způsobem přidat více jazyků. Pomocí FIND_IN_SET
místo toho by fungovalo i kritérium druhého řádu (FIND_IN_SET(cl.language_id,'1,2,3') DESC
nebo jakoukoli objednávku, kterou byste preferovali).
Samozřejmě tento dotaz právě teď je pro pevné country_id. Mohlo by být rozšířeno podobným způsobem pro více zemí s dalším připojením:
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
alternativou k dílčím dotazům by bylo připojit se k country_languages dvakrát a pouze vybrat ten první, který není null (což je pravděpodobně jedno z čistších řešení):
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)
Pokud je ID jazyka 1 vaším záložním jazykem. To lze také rozšířit tak, aby poskytovalo několik záložních jazyků ...