2016-08-23 4 views
0

Я создал приложение для нескольких языков. База данных выглядит следующим образом:Если одна запись не существует, выберите другую

Таблица вещей

|id| img |url| 
-------------- 
|1 |  | | 
|2 |  | | 
|3 |  | | 

Таблица things_translations

|id| thing_id | title | locale | 
--------------------------------- 
|1 |  1  |  | en | 
|2 |  2  |  | en | 
|3 |  3  |  | en | 
|4 |  2  |  | ru | 

У меня есть язык по умолчанию на английском языке (локаль = еп).

Когда я получаю переводы title от things_translations на другом языке, кроме английского, и этого языка в базе данных еще нет. Я бы хотел получить английскую версию.

Я пробовал ниже запрос, но возвращает все записи вместо:

select things.id 
FROM things 
INNER JOIN things_translations ON things.id = things_translations.thing_id 
WHERE CASE WHEN things_translations.locale = ru IS NULL 
THEN things_translations.locale = en END 

С выше запроса я получаю как язык для thing_id:2, но я только хочу, чтобы получить ru locale не en, потому что существуют.

+0

Вы можете также добавить ожидаемый результат? – jarlh

+0

Почему вы не пытаетесь выполнить условие ИЛИ? а не case things_translations.locale = ru или things_translations.locale = en – Gopidoss

+0

@jarlh Я хочу получить только одну локаль каждый раз для каждой вещи не всех. –

ответ

1
SELECT IFNULL(TT1.title,TT.title) 
FROM things T 
LEFT JOIN things_translations TT 
    ON (T.id = TT.thing_id AND TT.locale = 'en') 
LEFT JOIN things_translations TT1 
    ON (T.id = TT1.thing_id AND TT1.locale = 'ru') 
WHERE T.id = 2; 

SQL Demo

0

Я думаю, что ваш CASE оценивает истинно, следовательно, показывает все.

Вы можете присоединиться things_translations дважды - один раз с выбранным языком, и один раз английскими, в соответствующих разделах. Тогда ваша колонка будет COALESCE(things_translations.title, things_translations_en.title). Другими словами, попробуйте things_translations (ваше соединение с выбранным языком) для заголовка, и если это значение null, используйте заголовок из things_translations_en. Вам также понадобится в вашем месте where что-то, что делает два идентификатора объединения равными, иначе вы получите слишком много строк.

1

Я работал на том же типе приложения и решить мою проблему с СЛУЧАЙ:

SELECT t.id FROM things t 
INNER JOIN things_translations tt ON t.id = tt.thing_id 
AND tt.locale = CASE WHEN 
EXISTS(SELECT tte.locale FROM things_translations tte WHERE tt.thing_id = t.id AND tte.locale = 'ru') THEN 'ru' 
    ELSE 'en' 
    END 
+0

Он возвращает Неизвестный столбец 'ru' в 'where clause' –

+0

Работает ли он для вас? –

+0

Благодарим вас за помощь, я сделал это с ответом @zakhefron. –

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