多个组中的多个人SQL

时间:2016-11-20 22:13:41

标签: mysql sql database

我有一张供人们使用的表格和一张可以加入的可能群组的表格。显然,多个人可以在同一组中,并且一个人可以在多个组中。我无法弄清楚如何使用MySQL或任何SQL数据库来解决这个问题。我有一个解决方案,但我不知道这是不是通常做的事情。

我尝试的是拥有第三个表,我称之为成员资格,其中包含person_id和group_id的列。实际上,它是有序对的表。

所以我有人姓名和主键,有名字和主键的人,然后有一个人的主键和一个组的主键。这样,我可以多次列出同一个人的主键,以使它们成为多个组的一部分。

然后列出特定组的所有成员,我会进行以下查询:

SELECT DISTINCT users.name AS 'Members of Group 2'
FROM users, memberships, groups 
WHERE users.user_id = memberships.user_id 
AND memberships.group_id = 2;

要列出一个人所属的所有群组,我会执行以下查询:

SELECT DISTINCT groups.name AS 'Groups of User 3'
FROM groups, memberships, users
WHERE groups.group_id = memberships.group_id
AND memberships.user_id = 3;

我必须使用distinct命令,否则它将打印列表的次数等于组的总数。因此,如果我有5个组并且想要特定组中的人员列表,它将打印相同的列表5次。我不知道为什么会这样做。但是我把DISTINCT这个词扔了进去然后就有用了。

所以它功能齐全,但它很草率,而且我不知道这是不是通常的方式。人们通常如何做到这一点?

1 个答案:

答案 0 :(得分:0)

从不FROM子句中使用逗号。 始终使用显式JOIN语法。您的查询应该是:

SELECT u.name as Group2Member 
FROM users u JOIN
     memberships m
     ON u.user_id = m.user_id 
WHERE m.group_id = 2;

注意:您不需要groups表。

对于成员所在的群组:

SELECT g.name as User3Group
FROM memberships m join
     groups g
     ON g.group_id = m.group_id
WHERE m.user_id = 3;

对于任一查询,您都不应该使用DISTINCT,也不需要# del test1.txt *.html testing.doc # Successfully moved to Dustbin 。这只是浪费计算资源。