SELECT类别FROM数据库使用不同的语言

时间:2010-12-17 19:14:06

标签: php mysql relational-database

我希望有人会告诉我如何继续,因为我现在正在失去理智。

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

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(french)

当我尝试相同的查询时:

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:学生

我的查询中有什么问题吗?

提前致谢。

3 个答案:

答案 0 :(得分:3)

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

  

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

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

多语言支持需要更多工作。这个问题已得到解决,但没有明确处理,而且需要解决。由于这两个严重的问题没有得到解决,难怪你在精神上受到压力。而且假设你有足够的资格胜任这项任务,否则你会有第三个压力因素。

你需要这样的东西。

▶Normalised Data Model◀(内联链接在某些浏览器/版本上不起作用。)

不熟悉关系建模标准的读者可能会发现▶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就是这样,无论它们出现在哪里。没有空,没有外连接。

以下是您的语言中的相同查询(让我们假设英语):

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
        )

答案 1 :(得分:1)

加入字符串是昂贵且有风险的。当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来消除重复名称的问题。

答案 2 :(得分:1)

尽管规范化和自然关键问题......您的查询应该像

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
相关问题