使用连接的多对多关系

时间:2010-03-10 14:02:35

标签: mysql join

我有一个数据库有两个表和一个链接表,我需要一个JOIN查询:

以下是我的表格:

family(userid(int),loginName等)
member(memberid(int),loginName(这会将成员链接到一个系列),名称等)

链接表: user2member(userid,memberid)...都是外键吗?

我想做两件事:

1)能够将family.loginName(12,Johnson)订阅另一个family.loginName(43,Smith)并将其记录到链接表中。

看起来像这样: 12,43

2)当我查询Johnson家族中的所有member.name时,我会得到所有的Johnsons&所有的史密斯。

如果Johnson = Ted,Sue&帕蒂 IF Smith = Joe,Sue&鲍勃

我的查询结果将是Johnson现在= Ted,Sue,Patty,Joe,Sue,Bob

我几天前问过这个问题而没有好的表名,我最后让自己和好人Ollie Jones混淆了,他们在查询中发布了类似的答案:

SELECT member.name
 FROM family
   JOIN user2member on family.userid = member.memberid
   JOIN member on user2member.name = member.name
 WHERE family.userid = '30'
ORDER BY member.name

我不得不改变Ollie的答案以匹配我的牌桌,但我在第5行得到限制误差0,30。

这是我第一次做JOINS,我不知道这是否正确。

谢谢,

以下是我的第一个问题的链接:mySQL table linking , group linked to other members lists, the displaying all members

1 个答案:

答案 0 :(得分:1)

我不确定,如果您建议的表格可以解决您的问题。如果我理解你的问题是正确的,那么就有两种关系:

  • 所有家庭成员的关系(约翰逊与特德,苏,帕蒂,史密斯与乔,苏,鲍勃)
  • 订阅关系(一个家庭可以订阅另一个家庭)

我建议遵循以下表格:

  • family(f_id,f_loginName等)
  • member(m_id,m_f_id,m_name)(家庭的外键,多对一关系)
  • 订阅(s_f_id,s_to_f_id)(链接基于两个家庭密钥)

这将导致以下内容:

family:
f_id   f_loginName
12     Johnson
43     Smith

member:
m_id   m_f_id   m_name
1      12       Ted
2      12       Sue
3      12       Patty
4      43       Joe
5      43       Sue
6      43       Bob

subscription
s_f_id s_to_f_id
12     43

现在,为了获得特定系列的所有可能成员及其订阅,我将使用以下SQL查询。它为家庭及其家庭成员提供简单的联系。在WHERE子句中,获取家族Johnson(f_id = 12)并从订阅中获取所有家庭成员,使用子查询更容易。

SELECT f_loginName, m_name 
FROM family
INNER JOIN member ON m_f_id = f_id
WHERE f_id = 12 
      OR f_id IN (SELECT s_to_f_id FROM subscription WHERE s_f_id = 12) 
ORDER BY f_loginName, m_name;