我有一张供人们使用的表格和一张可以加入的可能群组的表格。显然,多个人可以在同一组中,并且一个人可以在多个组中。我无法弄清楚如何使用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这个词扔了进去然后就有用了。
所以它功能齐全,但它很草率,而且我不知道这是不是通常的方式。人们通常如何做到这一点?
答案 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
。这只是浪费计算资源。