2012-09-23 145 views
1

我有一个person表和language表。每个人最多可以说4种语言。我的客户想要搜索可以说话的人,例如Spanish我可以在结果表中显示一对多结果吗?

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

表可能对每种语言一列,并在NULL填写,如果他们没有所有4种语言,即:

Language 1 
Language 2 
Language 3 
Language 4 

但这似乎很邋遢。

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

目前,我不得不告诉我的客户,结果表只能显示其中一个人(1到1)的列,即namelocation,本地语言等只有当客户端点击人,可以揭示他们所有的语言。

有谁知道是否有一种常见的方法来解决这个问题?希望这是有道理的

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

李四,高谭市,西班牙

然后

李四,高谭市,上下一行法国

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

+0

你的表结构究竟是什么,你的查询是什么?你是否想要一个包含所有人语言的结果集? –

+0

请检查如何标记答案。如果你没有很好的回答率,很多人将来都不会回答你的问题。 –

+0

谢谢你的回应 – Alex

回答

0

已经想过这个多一些,看来你有以下选项

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

在我的选择中,选项1是最好也是最简单的。 SQL在做什么时非常好,在做什么时很糟糕,因此最好采用SQL的最佳部分并用声明性语言的最佳部分包围它们。

+0

谢谢你。我已经选择了选项1 - 并且在结果表中不会有一列,其中该人员可以为该列提供多个项目。无论如何,这是多余的 - 如果我的客户将搜索过滤到西班牙语发音者,我们知道所有返回的结果都可以说西班牙语,所以不需要在结果表中显示“列西班牙语”的列。至少,这就是我将解决方案“卖”给客户的方式 – Alex

0

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

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

+0

嗨,谢谢你的回应。 – Alex

+0

请参阅我添加到问题的附加评论 – Alex

+0

然后难道你不能在服务器端处理你的查询结果吗?没有太多的痛苦,在数据库层面上确实无法完成。 –

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 
+0

嗨。我确实有这个。查看我添加到原始问题中的额外文本。如果在搜索标准中定义了NO语言,则会出现问题 - 它将返回所有语言,并最终在结果表中为该人输入4个条目。对不起,如果我不清楚 – Alex

+0

如果一个人不说话,那么在p2l表中将不会有行。在这种情况下,您需要“左连接”而不是“内连接” –

0

创建两个表
有人cloumns- person_id,person_name & more如果你想。
创建另一个表-language已经columns- person_id,lang1,lang2,lang3,lang4
使person_id as foreign key
现在当u要访问的语言,只是compairing获取它们PERSON_ID

SELECT p.person_id 
FROM person p, language l 
WHERE p.person_id = l.person_id; 
+0

当需要添加新语言时会发生什么?这是一个非常不灵活的解决方案,应该不惜一切代价避免。这违反了第一种正常形式 - 没有重复的组。 –

+0

@ No'amNewman:它在哪里重生 –

+0

@Ravindra bagaleji:tumach uttar barobar aahe .. – Freelancer