我可以在结果表中显示一对多的结果吗?

时间:2012-09-23 08:56:26

标签: mysql

我有person的表格和language的表格。每个人最多可以说4种语言。我的客户希望搜索可以发言的人,例如Spanish

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

该表可以包含每种语言的列,如果它们没有全部4种语言,则填写NULL,即:

Language 1
Language 2
Language 3
Language 4

但这似乎非常草率。

我已经考虑使用逗号分隔列表在一列中列出所有语言,但这对于按字母顺序对列进行排序非常有用。

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

有没有人知道是否有一种解决这个问题的常用方法?希望这是有道理的

我有一张关联表。问题是我的搜索将返回

joe bloggs,gotham city,西班牙语

然后

joe bloggs,gotham city,french

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

4 个答案:

答案 0 :(得分:1)

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

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

然后,要获得一个人们讲西班牙语的列表,您需要一个像

这样的查询
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 

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

创建两个表
如果你愿意的话,有一个人 - person_id,person_name & more 创建另一个表 - 包含列的语言 - person_id,lang1,lang2,lang3,lang4
制作person_id as foreign key
现在当你想要访问语言时,只需通过compaiing person_id

来获取它们
 SELECT p.person_id
FROM person p, language l
WHERE p.person_id = l.person_id;

答案 3 :(得分:0)

考虑到这一点后,似乎你有以下选择

  1. 使用Christophe和我建议的简单连接/链接/关联表,然后按下调用SQL的程序中的数据。这是最简单的路线。
  2. 维护以逗号分隔的语言列表以及连接表。联接表将允许您回答诸如“谁说西班牙语”之类的查询,而该列表将使您能够打印出每人的语言列表。维护此列表将是一个问题。
  3. 使用Ravindra的“每种语言专用字段”方法;每当你需要一种新语言时,你将不得不改变字段结构,因此非常不推荐这种方法。
  4. 使用交叉表查询;这很难做到,取决于您使用的SQL风格。请看这篇文章creating-cross-tab-queries-and-pivot-tables-in-sql
  5. 在我的选项中,选项1是最好和最简单的。 SQL在它的功能方面表现出色,而在它不做的事情上表现糟糕,所以最好采用SQL的最佳部分并用声明性语言的最佳部分包围它们。