繁体   English   中英

使用不同的语言从数据库中选择类别

[英]SELECT categories FROM database using different languages

我希望有人能给我一个思路,因为我现在正在失去理智。

我刚刚在数据库中制作了两个表。 第一个看起来像这样:

categories
categories_id
cat_group (categories group)
cat_name (category name)
cat_lang (category language)

第二个:

users
users_id
username
category

您可能会问自己,为什么我要使用“类别组”。 好吧,有时我需要从数据库中为特定组提取所有类别。 让我们来看一个例子:

cat_group = teacher
cat_name = teacher
cat_lang = 1 (en)

cat_group = teacher
cat_name = leraar
cat_lang = 2 (dutch)

cat_group = teacher
cat_name = professeur
cat_lang = 3 (french)

当我现在尝试从两个表中选择所有教师时,它工作正常。 但是有时类别名称在不同语言中是相同的。

例如:

类别名称:学生(英语)类别名称:学生(荷兰语)类别名称:étudiant(法语)

当我尝试相同的查询时:

SELECT users.username, users.category, categories.cat_group 
FROM users
LEFT JOIN categories ON users.category = categories.category_name
WHERE categories.cat_group = 'student'

我得到以下结果:

student adam student
student chris student
étudiant brian student
student adam student
student chris student

我不知道我在做什么错。 我只需要类似以下内容:category_name:学生用户名:adam category_group:学生

我在查询中做错什么了吗?

提前致谢。

我不了解任何答案如何真正解决您的问题。 例如,您应该如何确定使用哪种语言?

我只需要...在查询中做错什么了吗?

我们需要回到第一原则。 数据模型尚未准备好进行编码。 如果是这样,代码将很容易。

多语言支持需要更多的工作。 该问题已解决,但未明确解决,需要解决。 由于这两个严重问题尚未解决,因此您的精神压力也就不足为奇了。 这是假设您有足够的资格胜任这项工作,否则您会感到压力的第三个原因。

您需要这样的东西。

▶标准化数据模型Data (内联链接在某些浏览器/版本上不起作用。)

不熟悉关系建模标准的读者可能会发现▶IDEF1X Notation◀有用。

您的示例为每个用户显示了一个类别,因此我提供了该类别; 如果一个用户可以属于多个类别,那么您需要一个不同的模型,请告诉我。

现在,您的查询很简单。 我知道您的查询只是一个示例,但是没有上下文,并且在特定于语言的环境中,语言始终是顺序最高的语言,始终是上下文的一部分。 这是一个查询),类似于您的示例,针对使用语言的所有类别的所有用户:

SELECT  FirstName,
        LastName,
        Name AS Category
    FROM User              U,
         CategoryLanguage  CL
    WHERE U.CategoryId   = CL.CategoryId
    AND   U.LanguageCode = CL.LanguageCode
注意,没有必要加入Category 这是因为我已经使用了存在的标识符 ,并且按照标准将其迁移到了子表中,并且没有在移动的所有对象上都添加一个Id列(对于整个地方的Id列,是的,必须加入Category ;这已被淘汰)。 无论它们出现在什么地方, CategoryIdLanguageCode都是这样。 没有Null,没有外部联接。

以下是您所用语言的相同查询(假设使用英语):

 SELECT FirstName, LastName, Name AS Category FROM User U, CategoryLanguage CL WHERE U.CategoryId = CL.CategoryId AND U.LanguageCode = "en" -- or ${language} from the app layer AND U.CategoryId = ( SELECT CategoryId FROM CategoryLanguage WHERE LanguageCode = "en" -- or ${language} from the app layer AND Name = "Student" -- or ${category} from the app layer ) 

连接字符串很昂贵且有风险。 当category_name在Categories中更改时会发生什么? 您必须将更新级联到所有“用户”记录。 一些建议:

  1. 使用Categories_id作为用户到类别的链接,而不是实际的字符串描述。
  2. 创建具有ID和Description列的Categories_Group表。 如上所述,使用该ID作为从Categories到Categories_Group的链接,而不是将描述性的组文本存储在Categories表中。
  3. 最后,在联接条件中使用users.categories_id,并在where子句中使用Categories.cat_group_id来消除名称重复的问题。

尽管存在标准化和自然键问题,但您的查询应该像

LEFT JOIN 
  categories ON users.category = categories.category_name and
  categories.cat_name='student' <-- make sure cat_name is student (dutch,english)
  and categories.cat_group='student'
  and cat_lang=1 <-- if is english

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM