MySQL ПРИСОЕДИНЯЙТЕСЬ к одной из строк второй таблицы - PullRequest
0 голосов
/ 07 июня 2018

У меня есть 2 таблицы: одна для ресторанов, содержащих общую информацию, а другая - для переводов ее описания.Во второй таблице есть такие столбцы:

restaurant_id, description, language

Клиентское приложение делает запрос на список ресторанов и передает язык это хочет результат для.Так что теперь мне нужно присоединиться к этим 2 таблицам.Все было бы легко, если бы в каждом ресторане было описание на каждом из доступных языков, но его нет.В некоторых ресторанах отсутствуют описания на некоторых языках.

Таким образом, если описание отсутствует на выбранном языке, я должен вернуть описание на default языке (например, пусть это будет eng).

Таким образом, вопрос в том, как я могу присоединиться к таблицам таким образом, чтобы, если описание на выбранном языке доступно - присоединиться к нему, в противном случае - присоединиться к eng?

Ответы [ 2 ]

0 голосов
/ 07 июня 2018

Еще одно решение - использовать временную таблицу для выбора идентификаторов ресторанов, имеющих перевод, а затем использовать UNION для объединения ресторанов с переводом + все рестораны по умолчанию, кроме идентификаторов ресторанов с переводами:

Создать временную таблицус идентификаторами:

CREATE TEMPORARY TABLE IF NOT EXISTS existing_ids AS (SELECT r.id FROM restaurant r JOIN translation t ON r.id = t.restaurant_id WHERE t.lang = 'fr');

Выбор строк с переводом:

SELECT r.name, t.description FROM restaurant r JOIN translation t ON r.id = t.restaurant_id WHERE t.lang = 'fr'

Объединение строк с переводом по умолчанию, исключая идентификаторы из временной таблицы:

UNION 
SELECT r.name, t.description FROM restaurant r JOIN translation t ON r.id = t.restaurant_id WHERE t.lang = 'en' AND id not in (SELECT id from existing_ids)

Демонстрация:http://sqlfiddle.com/#!9/d3e66dc/1

0 голосов
/ 07 июня 2018

То, что вы можете сделать, это левое соединение на вашу переводы таблицу с выбранным языком, а также внутреннее объединение на переводы снова сязык по умолчанию.

Затем вы можете использовать COALESCE, чтобы выбрать первое ненулевое значение.Например,

SELECT r.name, COALESCE(t.description, t_default.description) as description
FROM restaurant r
LEFT JOIN translation t ON r.id = t.restaurant_id
  AND t.lang = 'fr' -- the chosen language
INNER JOIN translation t_default ON r.id = t_default.restaurant_id
  AND t_default.lang = 'en' -- the default language

Демо ~ http://sqlfiddle.com/#!9/aa68c0/1


Я использовал INNER JOIN для языка по умолчанию, чтобы обеспечить отображение значения.Если вас устраивает возможный результат NULL, измените его на LEFT JOIN.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...