2016-07-22 3 views
0

Я новичок в stackoverflow, надеюсь, что отправьте мой вопрос правильно.Mysql left join with или condition for fallback language

У меня есть две таблиц «страна» и «countries_lang»

+------+--------------+-----------------+ 
| id | region_code | sub_region_code | 
+------+--------------+-----------------+ 
| 1 | 142   | 034    | 
| 2 | 150   | 154    | 
| 3 | 002   | 015    | 
+------+--------------+-----------------+ 

+-----+--------------+---------------+--------------+ 
| id | pid | lang_code | lang_name | lang_capital | 
+-----+------------------+-----------+--------------+ 
| 1 | 1 | en_GB  |Canada  | Ottawa  | 
| 2 | 1 | de_DE  |Kanada  | Ottawa  | 
| 3 | 2 | en_GB  |Italy  | Rome   | 
+-----+------+-----------+-----------+--------------+ 

en_GB язык запасного варианта так что моя цель состоит в том, чтобы присоединиться к countries_lang пропускания lnaguage если не в таблице возвращает значение языка запасного варианта

пример:

выбранный язык de_DE

+------+--------------+-----------------+--------------+ 
| id | region_code | lang_name  | lang_capital | 
+------+--------------+-----------------+--------------+ 
| 1 | 142   | Kanada   | Ottawa  + 
| 3 | 150   | Italy   | Rome   + (fallback language) 
+------+--------------+-----------------+--------------+ 

Я пробовал:

Select * FROM countries AS c 
LEFT JOIN ( 
    SELECT pid, 
     COALESCE(
      (
       SELECT lang_name FROM countries_lang WHERE lang_code = 'de_DE' AND pid = c.id 
      ), 
      (
       SELECT lang_name FROM countries_lang WHERE lang_code = 'en_GB' AND pid = c.id 

      ) 
     ) AS cl_name, 
     COALESCE(
      (
       SELECT lang_capital FROM countries_lang WHERE lang_code = 'de_DE' AND pid = c.id 
      ), 
      (
       SELECT lang_capital FROM countries_lang WHERE lang_code = 'en_GB' AND pid = c.id 

      ) 
     ) AS cl_capital 
    FROM countries_lang 
) AS cl 

ON (c.id = cl.pid) 

но возвращение c.id НЕИЗВЕСТНЫЙ Колонка

Любое предложение? 2 дня, что я делаю тест, чтобы решить эту проблему

Спасибо всем !!!

EDIT

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

Select * FROM countries AS c 
LEFT JOIN ( 
    SELECT pid, lang_name, lang_code FROM countries_lang WHERE lang_code = 'de_DE' AND lang_code IS NOT NULL OR lang_code = 'en_GB' 
) AS cl ON 
c.id = cl.pid 
+0

Непонятно, как присоединиться к вашим двум таблицам, а также непонятно, почему ваш ожидаемый результат показывает английский, когда на самом деле уже есть запись. –

+0

Как вы определяете, какой резерв? –

+0

Привет, я не понимаю, почему соединение не ясно, вырезаем среднюю часть –

ответ

1

я ограниченные знания о том, что ваша логике схемы является и то, что именно вы пытаетесь запросить. Вот что я могу придумать на основе вашей информации. Дайте мне знать, как это происходит.

Запрос:

select cl.id, c.region_code, cl.lang_name, cl.lang_capital 
from countries_lang cl 
join countries c on c.id = cl.pid 
left join 
(select cl.id, cl.pid 
from countries_lang cl 
join countries c on c.id = cl.pid and cl.lang_code = 'de_DE') fcl on cl.pid = fcl.pid 
where cl.id = fcl.id or fcl.id is null 

Результат:

+------+--------------+-----------------+--------------+ 
| id | region_code | lang_name  | lang_capital | 
+------+--------------+-----------------+--------------+ 
| 2 | 142   | Kanada   | Ottawa  + 
| 3 | 150   | Italy   | Rome   + 
+------+--------------+-----------------+--------------+ 
+0

Привет спасибо ваш ответ. Я не думаю, что схема не ясна, и моя цель si clear присоединяется ко второй таблице, и если значение выбранного языка (de_DE), например, равно null, отображает язык по умолчанию en_GB. Кстати, в вашем коде, где вы передаете язык по умолчанию en_GB? –

+0

Hi Tin Я хорошо проверил ваш код, и ваше решение лучше справляется с оценкой производительности. ;) –

0

Ok нашли решение и надежда быть полезным для кого-то!

SELECT * FROM countries AS c 
LEFT JOIN ( 
    SELECT jc.id, countries_lang.pid, countries_lang.lang_code, 

    COALESCE(
     (
      SELECT lang_name FROM countries_lang 
      WHERE countries_lang.pid = jc.id AND countries_lang.lang_code = 'de_DE' 

     ), 
     (
      SELECT lang_name FROM countries_lang 
      WHERE countries_lang.pid = jc.id AND countries_lang.lang_code = 'en_GB' 

     ) 
    ) AS coal_lang_name, 

    COALESCE(
     (
      SELECT lang_capital FROM countries_lang 
      WHERE countries_lang.pid = jc.id AND countries_lang.lang_code = 'de_DE' 

     ), 
     (
      SELECT lang_capital FROM countries_lang 
      WHERE countries_lang.pid = jc.id AND countries_lang.lang_code = 'en_GB' 

     ) 
    ) AS coal_lang_capital 

    FROM countries_lang 

    join countries jc on jc.id = countries_lang.pid 
) AS cl ON 
(c.id = cl.pid) 

Для применимы ко всем языкам просто нужно установить 2 сеанса переменной один для fallback_language и один для выбранного языка

пример

$ fallback_lang = $ _SESSION [ 'en_GB']; или любые другие $ lang = $ _SESSION ['de_DE']; или любой другой -> получить от выбора

и изменения в коде выше

первое COALESCE ГДЕ countries_lang.pid = jc.id И countries_lang.lang_code = '$ LANG'

второй COALESCE WHERE countries_lang.pid = jc.id AND countries_lang.lang_code = '$ fallback_lang'

COALESCE получите первое значение, которое не равно NULL, поэтому перед выбранным, чем резервный.

Cheers !!

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

  • Нет связанных вопросов^_^