我有person
的表格和language
的表格。每个人最多可以说4种语言。我的客户希望搜索可以发言的人,例如Spanish
。
我的问题是结果表目前没有名为Language
的列,因为它们会说多个。我只能显示第一个,但隐藏他们说的其他语言会产生误导。
该表可以包含每种语言的列,如果它们没有全部4种语言,则填写NULL
,即:
Language 1
Language 2
Language 3
Language 4
但这似乎非常草率。
我已经考虑使用逗号分隔列表在一列中列出所有语言,但这对于按字母顺序对列进行排序非常有用。
目前,我不得不告诉我的客户,结果表只能显示此人拥有其中一个(1到1)的列,即name
,location
,母语等。只有当客户点击该人时,才能显示他们的所有语言。
有没有人知道是否有一种解决这个问题的常用方法?希望这是有道理的
我有一张关联表。问题是我的搜索将返回
joe bloggs,gotham city,西班牙语然后
joe bloggs,gotham city,french
在下一行 - 但随后同一个人在表格中列出两次。当我将其限制为每个名字一个条目时,我只会得到“joe bloggs,gotham city,spanish”。现在我不知道他也说法语。这更清楚吗?
答案 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是最好和最简单的。 SQL在它的功能方面表现出色,而在它不做的事情上表现糟糕,所以最好采用SQL的最佳部分并用声明性语言的最佳部分包围它们。