SQL запрос для MySQL

Есть таблица с названием городов на разных языках.

city_id lang_id name
1 ru Москва
1 en Moscow
1 de Moskau
2 en Berlin
2 de Berlin

Как получить список всех городов, которые указаны на русском языке. А те города, которые на русский не переведены, получить их английский вариант?
  • Вопрос задан
  • 2646 просмотров
Пригласить эксперта
Ответы на вопрос 5
@rPman
Какие сложные запросы и почти наверняка засовываются в главные страницы (т.е. будут всегда запрашиваться), неужели сложно добавить поле boolean need_translate, и на время, отсутствия перевода, вставить английский во все языки.

p.s. лучше делать так: таблица towns {id, ru,en,fr,...} т.е. по полю на язык, соответственно запросы будут проще и шустрее.
Ответ написан
Ambrose
@Ambrose
select city_id, name
from cities
(where lang_id = 'ru')
or
(city_id not in (select city_id, name from cities where lang_id = 'ru') and lang_id='en')
Ответ написан
mark_ablov
@mark_ablov
select IFNULL(t2.name, t1.name) finalName from t t1 left join t t2 on (t1.city_id = t2.city_id and t2.lang_id = 'ru') where t1.lang_id = 'en'

Как-то так.
Джойном подбираем русские переводы для городов, затем фильтруем по английским названиям.
В итоге получаем с одной стороны английский город, с другой — русский, либо NULL, если нету.
Ответ написан
karui
@karui
SELECT max(name) FROM cities c
where c.lang_id in ("ru","en")
group by c.city_id;
Ответ написан
FreeTibet
@FreeTibet
dharma supplier

SELECT 
	t.city_id, 
    COALESCE(cru.lang_id, cen.lang_id) AS lang_id,
	COALESCE(cru.`name`, cen.`name`) AS `name`
FROM (
	SELECT city_id FROM city 
    WHERE lang_id IN('ru', 'en') 
    GROUP BY city_id
) AS t 
LEFT JOIN city AS cru ON cru.city_id = t.city_id AND cru.lang_id = 'ru'
LEFT JOIN city AS cen ON cen.city_id = t.city_id AND cen.lang_id = 'en'
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы