2015-01-29 4 views
0

У меня есть поверхностное знание SQL, и у меня проблемы с запросом, слишком сложным для меня.SQL-выбор «лучших» строк

У меня есть таблица APPS с столбцом имени и описания, которые являются идентификаторами для ссылки на правильный перевод. И у меня есть таблица локализованных строк.

APPS (app_id, name_strid, description_strid) НИТИ (str_id, lang_id, струны)

Мне нужен запрос, вернуть все приложения, с лучшим переводом для каждого из строк. лучше в порядке языка (позвольте мне сказать: это-то, что, еп)

я достиг решение, чтобы получить все приложения заказ языков:

SELECT A.app_id, S1.string, S2.string 
FROM APPS as A 
JOIN STRINGS AS S1 
ON A.name_strid = S1.str_id 
JOIN STRINGS AS S2 
ON A.description_strid = S2.str_id 
WHERE S1.lang_id = S2.lang_id 
AND S1.lang_id IN ("it-it", "it", "en") 
ORDER BY 
    CASE S1.lang_id 
     WHEN "it-it" THEN 1 
     WHEN "it" THEN 2 
     WHEN "en" THEN 3 
     ELSE 4 
    END; 

Как я могу получить только лучший язык ?

Благодаря

+0

Так что, если он-то перевод присутствует всегда лучший перевод затем приходит и последний en? –

ответ

1

В большинстве диалектов SQL, вы бы решить эту проблему с помощью row_number(), но у вас нет такой возможности. Один из способов решения этого вопроса - с коррелированным подзапросом - это вытаскивает первый язык соответствия для каждого str_id, который затем можно использовать для фильтрации.

SELECT A.app_id, S1.string, S2.string 
FROM APPS as A JOIN 
    STRINGS AS S1 
    ON A.name_strid = S1.str_id JOIN 
    STRINGS AS S2 
    ON A.description_str_id = S2.str_id AND 
     S1.lang_id = S2.lang_id 
WHERE S1.lang_id IN ('it-it', 'it', 'en') AND 
     S1.lang_id = (SELECT s3.LangId 
        FROM Strings s3 
        WHERE s3.str_id = S1.str_id 
        ORDER BY (CASE S3.lang_id 
            WHEN 'it-it' THEN 1 
            WHEN 'it' THEN 2 
            WHEN 'en' THEN 3 
            ELSE 4 
           END) 
        LIMIT 1 
       ); 
+0

Спасибо. Я думаю, у тебя был обман. Меняя 'ORDER BY (CASE S1.lang_id' на 'ORDER BY (CASE S3.lang_id), это работает! Я принимаю это как правильный ответ. – ARLabs

+0

@ARLabs .... Хорошо. Спасибо. –

0

Вы можете использовать оператор EXISTS, чтобы убедиться, что нет никакого другого перевода с «лучшим результатом»:

SELECT A.app_id, S1.string, S2.string 
FROM APPS as A JOIN STRINGS AS S1 ON A.name_strid = S1.str_id 
       JOIN STRINGS AS S2 ON A.description_strid = S2.str_id 
WHERE S1.lang_id = S2.lang_id 
AND S1.lang_id IN ("it-it", "it", "en") 
AND NOT EXISTS (SELECT 1 
       FROM STRINGS S3 
       WHERE (CASE S3.lang_id 
         WHEN "it-it" THEN 1 
         WHEN "it" THEN 2 
         WHEN "en" THEN 3 
         ELSE 4 END) < (CASE S1.lang_id 
            WHEN "it-it" THEN 1 
            WHEN "it" THEN 2 
            WHEN "en" THEN 3 
            ELSE 4 END) 
+0

Спасибо, но это не так. Я работаю. Если у меня есть одно приложение с локацией «it», я пропускаю все другие приложения, у которых есть только локация «en». – ARLabs

Смежные вопросы