我有两个表:一个用于包含一般信息的餐馆,另一个用于它的描述翻译。第二个表有这样的列:
restaurant_id
,description
,language
客户端应用程序请求餐馆列表,并传递它想要结果的语言。所以现在我需要加入这两个表。如果每家餐馆都有各种语言的描述,那么一切都会很简单,但事实并非如此。有些餐馆缺少某些语言的描述。
因此,如果所选语言中缺少说明,我应该以默认语言返回说明(例如,让它为eng
)。
所以问题是我如何以所选语言中的描述可用的方式加入表格 - 加入它,否则 - 加入eng
?
答案 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)