SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 09.03.2014 16:48:54

syscreat
Участник
Зарегистрирован: 20.03.2010
Сообщений: 6

Помогите, пожалуйста, составить правильно запрос.

Есть талица гео данных, взятых с geonames.org и следующий запрос:

select c.geo_nm_id, al.language, al.alt_name, al.is_preferred, al.is_short_nm, al.is_historic
    from oa_geo_country_tbl c
        inner join oa_geo_alternative_tbl al on al.geo_nm_key = c.geo_nm_id
    where c.geo_nm_id = 578853

здесь 578853 это идентификатор региона (Башкирия). Таблица oa_geo_country_tbl содержит данные о всех населенных пунктах в иерархии, включая страны, регионы, районы и города (поселки/деревни и т.д.). Таблица oa_geo_alternative_tbl содержит имена гео пунктов на разных языках, включая варианты на одном языке (Россия и Российская Федерация). Запрос возвращает следующие данные:

578853        Bashkirskaya ASSR    0    0    0
578853        Bashkortostan    0    1    0
578853        Bashkirskaya Avtonomnaya Sovetskaya Sotsialisticheskaya Respublika    0    0    0
578853        Baskhir    0    0    0
578853    ru    Республика Башкортостан    1    0    0
578853    ru    Башкортостан    1    1    0
578853    sv    Basjkirien    0    0    0
578853        Respublika Bashkortostan    0    0    0
578853    link    http://en.wikipedia.org/wiki/Bashkortostan    0    0    0

Нужно написать запрос, так, чтобы он учитывал поля IsPreferred, IsShort и IsHostoric (предпочитаемое, короткий вариант и историческое), причем каждое из полей может отсутствовать. Так же нужно иметь в виду, что язык может быть не указан, тогда нужно использовать вариант без указания языка.

Видимо, нужно составить серию запросов, и вот с этим возникает проблема. Ясно, что следующий запрос:

select *
    from oa_geo_administration_first_tbl a
    inner join oa_geo_country_tbl  c on c.geo_nm_id = a.geo_nm_id
    inner join oa_geo_alternative_tbl al on al.geo_nm_key = a.geo_nm_id
    where a.country_code = 'RU'
        and al.language  = 'RU'
    group by (c.geo_nm_id)
    order by (al.alt_name);

вернет не все регионы, дабы не для всех регионов указан перевод на русский язык. Если убрать al.language  = 'RU', запрос вернет список состоящий из наименований на русском и других языках, некоторые названия будут историческими и короткими.

Интересует сама методика построения затих запросов. Как их строить.

Посмотреть содержание таблиц можно здесь:
http://download.geonames.org/export/dump/

Отредактированно syscreat (09.03.2014 16:52:51)

Неактивен

 

#2 11.03.2014 14:52:37

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Помогите, пожалуйста, составить правильно запрос.

Если Вам нужна только одна строчка, то поможет

ORDER BY al.language  = 'RU' DESC, al.language='' DESC, IsPreferred DESC;


Это позволит удовлетворяющие критериям показывать первыми. LIMIT 1 оставит одну строчку

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson