现有联接的结果为空时的MySQL新联接

时间:2019-04-15 10:03:08

标签: mysql join

我有两个表:catcat_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的名字),{{1 }}值是name

在给定的备用语言环境(例如null)下,我不知道如何检查en的结果是否为JOIN,如果是这样,然后获取后备语言环境的null。即在上面的示例中,即使设置的语言环境为name,也要返回猫名Jane

1 个答案:

答案 0 :(得分:2)

只需在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

Demo on dbfiddle