добре, така че следната заявка вероятно може да бъде извършена без подзаявка, но вместо това с присъединяване. Бих вярвал, че оптимизаторът на заявки прави това, но не бих бил много сигурен.
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
В тази версия language_id 1 се използва като предпочитан резервен вариант, вероятно бихте могли да добавите още езици по подобен начин. Използване на FIND_IN_SET
вместо това като критерий за втори ред също ще работи (FIND_IN_SET(cl.language_id,'1,2,3') DESC
или какъвто ред предпочитате).
Разбира се, тази заявка в момента е за фиксиран country_id. Може да бъде разширено по подобен начин за множество държави с друго присъединяване:
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
алтернатива на подзаявките би била да се присъедините към country_languages два пъти и просто да изберете първата, която не е нула (което вероятно е едно от по-чистите решения):
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)
Ако езиков идентификатор 1 е вашият резервен език. Това може също да бъде разширено, за да предостави множество резервни езици ...