Q:

Fazer o SELECT retornar dados no idioma padrão quando não achar tradução

Estou montando uma base multi-idiomas.
Tenho um select com o idioma escolhido, mas não há garantia de que 100% do conteúdo esteja traduzido, então eu preciso fazer uma espécie de or para o idioma padrão como alternativa secundária.
select ...
 where ...
   and (idioma = 'pt-br' or idioma = 'en-us')

Há um relacionamento nessa consulta, mas não vem ao caso. O problema é que quando tenho entradas em ambos os idiomas, o select sempre retorna o com ID menor, no caso en-us:
id | idioma | texto
1  | en-us  | ...
2  | pt-br  | ...
3  | it     | ...

O que eu preciso é priorizar a linguagem desejada, e trazer a default apenas quando a desejada não for encontrada.

A:

Se entendi direito, não tem nenhuma garantia de qual ID será retornado. Fica difícil dar uma resposta precisa sem saber mais do seu banco, mas eu faria um JOIN para o conteúdo em cada idioma (o escolhido e o default), e uma query nesta linha:
SELECT
   -- ...
   COALESCE(conteudo_en.texto, conteudo_pt.texto) AS texto
FROM paginas pagina
   INNER JOIN conteudos conteudo_pt
   ON conteudo_pt.pagina_id = pagina.id
   AND conteudo_pt.idioma = 'pt-br'
   LEFT OUTER JOIN conteudos conteudo_en
   ON conteudo_en.pagina_id = pagina.id
   AND conteudo_en.idioma = 'en-us'
WHERE pagina.id = 1

A:

Você pode usar um ORDER BY e LIMIT 1, como no exemplo abaixo:
ORDER BY FIELD(idioma, 'en-us', 'pt-br'), idioma LIMIT 1

Nos valores da função FIELD você coloca primeiro o idioma que está buscando e depois o idioma padrão. Mais informações sobre a função FIELD.

