我有两个数据库表 - Categories
和LocalizedCategories
。 Categories
表格包含默认语言中所有类别的Name
和Description
列。 LocalizedCategories
表还包含这些列,其中包含这些列到其他语言的翻译(每种内容语言都有其id,因此表的主键包含ContentLanguageId
和CategoryId
)。我现在想要执行SELECT查询以获取所有类别,以便结果中的文本数据被本地化,以防翻译可用于给定的类别和内容语言。如果翻译不可用,或者内容语言是默认语言,我想回到Categories
表中的默认值。
这样的查询怎么样?是否有更好的方法来分离表格,以便查询和处理数据更简单?
答案 0 :(得分:2)
简单,只做一个左连接:
select Description = coalesce(lc.Description, c.Description )
, Name = coalesce(lc.Name, c.Name)
, Lang = coalesce(lc.Lang, DefaultContentLanguageId )
from Categories c
left join LocalizedCategories lc on c.CategoryId=lc.CategoryId and lc.ContentLanguageId = ?
答案 1 :(得分:2)
你的桌子设计似乎很好。要仅在数据存在时获取数据,请使用外部联接。然后使用COALESCE获取一个值或另一个值。
select
coalesce(lc.name, c.name),
coalesce(lc.description, c.description)
from categories c
left outer join localizedcategories lc
on lc.categoryid = c.categoryid and lc.contentlanguageid = 'EN';
答案 2 :(得分:1)
数据库架构没问题。您使用类别默认值和带有语言表的已翻译类别。 所以你有1-> lang n-> cat transaltions to - > n cats。
你应该查询数据库以便:
SELECT * FROM Categories INNER JOIN LocalizedCategories USING (Category_id) WHERE ContentLanguageId=?
如果给定的语言没有到Category_id的转换,则返回0行。 在您的服务器语言中,您可以完成这些并实现其背后的逻辑,如果给定的查询不返回任何数据,则查询默认表并用它们填充显示的数据。