0

我有以下两个表场景:

users
id   groups
1    1,2,3
2    2,3
3    1,3
4    3

groups
id
1
2
3

例如,如何返回属于组 2 和 1 的所有用户的 ID?我是否应该研究加入,一个帮助 group_membership 表或函数来分隔逗号分隔的组 ID 以获得如下内容:

group_membership
user_id   group_id
1         1
1         2
1         3
2         2
2         3
...       ...
4

4 回答 4

1

您应该在用户和组之间建立多对多的关系,(意味着一个用户可能属于多个组,一个组可以容纳多个用户)。

你可以通过 3 个表来做到这一点:

  • users - 描述用户信息。
  • - 描述组信息。
  • user_groups - 描述哪些用户属于哪些组。

user_groups中,您应该只有 2 列user_idgroup_id,每行是属于单个组的单个用户,允许双方重复。

您的示例转化为:

user_id   group_id
1         1
1         2
1         3
2         2
2         3
3         1
3         3
4         3

然后,很容易查询特定组中的所有用户,以及用户所在的所有组。

此过程也称为数据库规范化

于 2012-09-30T20:14:04.247 回答
0

The possible solution to your problem is a rearranging of your data.

For this, you need three tables. The users, the groups, and a 'link'-table.

users:

user_id
userdata1

groups:

group_id
groupdata1

link

user_id
group_id

In the link list, you create one dataset for each connection.

So, if user 1 is in groups 2 and 3, the link table will have two entries with the user_id 1. One linking to group_id 2, and one linking to group_id 3.

To get back to your example, the query to get all users from group 2 is:

SELECT * FROM users, link WHERE link.user_id = users.user_id AND (group_id = 2 OR group_id = 3);

This will output all the users, who are in one of the groups, some as duplicates (those, who are members of both groups). If you want to avoid duplicates, add 'GROUP BY user_id'

于 2012-09-30T20:10:13.617 回答
0

除了适当的规范化,唯一可用的hack,而且是hack,在这种情况下是使用 hack 的LIKE

这仍然是一种缓慢而可怕的做法。

SQL:

SELECT id FROM users 
WHERE 
   groups LIKE '%,$group_id,%' 
   OR groups LIKE '%,$group_id' 
   OR groups LIKE '$group_id,%'
于 2012-09-30T20:30:09.273 回答
0

您可以使用FIND_IN_SET()MySQL 功能。

于 2012-10-02T03:36:08.893 回答