MySQL JOIN第二个表中的一行

时间:2018-06-07 04:56:23

标签: mysql sql join

我有两个表:一个用于包含一般信息的餐馆,另一个用于它的描述翻译。第二个表有这样的列:

restaurant_iddescriptionlanguage

客户端应用程序请求餐馆列表,并传递它想要结果的语言。所以现在我需要加入这两个表。如果每家餐馆都有各种语言的描述,那么一切都会很简单,但事实并非如此。有些餐馆缺少某些语言的描述。

因此,如果所选语言中缺少说明,我应该以默认语言返回说明(例如,让它为eng)。

所以问题是我如何以所选语言中的描述可用的方式加入表格 - 加入它,否则 - 加入eng

2 个答案:

答案 0 :(得分:1)

您可以使用所选语言将左连接添加到翻译表中,并将内部联接添加到翻译再次使用默认语言。

然后,您可以使用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

答案 1 :(得分:0)

另一个解决方案是使用临时表来选择具有翻译的餐馆的ID,然后使用UNION将餐馆与翻译+所有默认餐厅组合,不包括具有翻译的餐馆ID:

使用ID创建临时表:

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'

与具有默认转换的行联合,不包括临时表中的ID:

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