1

我有一张桌子person和一张桌子language。每个人最多可以说 4 种语言。例如,我的客户想要搜索会说话的人Spanish

我的问题是结果表目前不会有一个名为的列,Language因为他们会说不止一个。我可以只显示第一个,但隐藏他们说的其他语言会产生误导。

该表可以为每种语言提供一列,NULL如果它们没有全部 4 种语言,请填写,即:

Language 1
Language 2
Language 3
Language 4

但这似乎很草率。

我考虑过使用逗号分隔的列表在单个列中列出所有语言,但这对于按字母顺序对列进行排序很有用。

目前,我不得不告诉我的客户,结果表只能显示该人拥有其中之一的列(1 到 1),即namelocation母语等。只有当客户点击该人时,它才能显示所有他们的语言。

有谁知道是否有解决这个问题的通用方法?希望这是有道理的

我确实有一个关联表。问题是我的搜索会返回

乔博客,哥谭市,西班牙语

然后

乔博客,哥谭市,法国

在下一行 - 但是同一个人在表中列出了两次。当我将其限制为每个名称一个条目时,我只会得到“joe bloggs, gotham city, spanish”。现在我不知道他还会说法语。这更清楚了吗?

4

4 回答 4

1

您应该有一个包含两个字段的连接表:人员和语言。每人每种语言应该有一行,所以如果一个人会说四种语言,那么这个用户将有四行。

此表的主键将包含两个字段。

然后要获取哪些人说西班牙语的列表,您需要一个类似的查询

select people.name
from people inner join p2l
on people.id = p2l.person
inner join languages
on p2l.language = languages.id
where languages.name = 'Spanish'

以及所有会说某种语言的人的名单

select people.name, languages.name
from people inner join p2l
on people.id = p2l.person
inner join languages
on p2l.language = languages.id 

现在是所有人的名单,无论他们是否说某种语言

select people.name, languages.name
from people left join p2l
on people.id = p2l.person
inner join languages
on p2l.language = languages.id 
于 2012-09-23T09:04:57.007 回答
0

如果你愿意,可以创建两个
有 cloumns 的桌子人。 创建另一个表 - 具有列的语言 - 现在当你想访问语言时,只需通过比较 person_id 来获取 它们person_id,person_name & more
person_id,lang1,lang2,lang3,lang4
person_id as foreign key

 SELECT p.person_id
FROM person p, language l
WHERE p.person_id = l.person_id;
于 2012-09-23T09:05:29.480 回答
0

所以解决这个问题的传统方法是创建一个称为关联表的东西,它具有人员表和语言表的外键。这使您可以添加任意数量的语言(包括零)。然后,您可以加入这些表以查找所有使用特定语言的用户。

这可能有助于如何构建数据库:http ://en.wikipedia.org/wiki/First_normal_form 有更高的范式,但这将帮助您解决当前的问题。

于 2012-09-23T09:01:17.037 回答
0

再考虑一下,您似乎有以下选择

  1. 使用 Christophe 和我建议的简单连接/链接/关联表,然后在调用 SQL 的程序中处理数据。这是最简单的路线。
  2. 维护一个逗号分隔的语言列表以及连接表。连接表将允许您回答诸如“谁会说西班牙语”之类的查询,而列表将使您能够打印出每个人的语言列表。维护此列表将是一个问题。
  3. 使用 Ravindra 的“每种语言的专用字段”方法;每次需要新语言时,都必须更改字段结构,因此非常不推荐这种方法。
  4. 使用交叉表查询;这很难做到,取决于您使用的是哪种 SQL。看看这篇文章创建交叉表查询和数据透视表

在我的选择中,选项 1 是最好和最简单的。SQL 擅长做的事,但不擅长做的事,因此最好采用 SQL 的最佳部分,并用声明性语言的最佳部分围绕它们。

于 2012-09-24T04:11:08.577 回答