MySQL new join, когда результат существующего объединения равен нулю - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть две таблицы: cat и cat_name.

cat:

id
--
1
2

cat_name:

id | cat_id | locale | name
---------------------------
1  | 1      | en     | John
2  | 1      | fr     | Jean
3  | 2      | en     | Jane

Мой SQL, чтобы получить списоккошек и их имена для данной локали:

SELECT `cat`.`id` AS `id`, `cat_name`.`name` AS `name` FROM `cat` 
LEFT JOIN `cat_name` ON `cat`.`id` = `cat_name`.`cat_id` AND `cat_name`.`locale` = 'fr'

Это работает, но когда имя кошки не имеет перевода для данной локали (например, в приведенном выше примере, если мы хотим получить fr имя для кошки 2), значение name, как и ожидалось, null.

Что я не могу понять, так это как, учитывая запасную локаль (например, en),проверить, является ли результат JOIN равным null, и если да, то получить name резервной локали.Т.е. в приведенном выше примере, чтобы вернуть имя кота Jane, даже если установлен языковой стандарт fr.

1 Ответ

2 голосов
/ 15 апреля 2019

Просто добавьте запасной язык в JOIN и затем используйте COALESCE, чтобы выбрать это значение, если для данного языка нет значения, например,

SELECT `cat`.`id` AS `id`, COALESCE(`c2`.`name`, `c1`.`name`) AS `name` 
FROM `cat` 
JOIN `cat_name` c1 ON `cat`.`id` = `c1`.`cat_id` AND `c1`.`locale` = 'en'
LEFT JOIN `cat_name` c2 ON `cat`.`id` = `c2`.`cat_id` AND `c2`.`locale` = 'fr'

Вывод:

id  name
1   Jean
2   Jane

Демонстрация на dbfiddle

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