返回指定为逗号分隔值的组中的所有用户

时间:2012-09-30 20:05:58

标签: php mysql select

我有以下两个表格场景:

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

groups
id
1
2
3

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

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

4 个答案:

答案 0 :(得分:1)

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

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

  • 用户 - 描述用户信息。
  • 群组 - 描述群组信息。
  • user_groups - 描述哪些用户在哪些组中。

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

您的示例转换为:

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

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

此过程也称为 Database Normalization

答案 1 :(得分:0)

您问题的可能解决方案是重新安排数据。

为此,您需要三个表。用户,组和“链接”表。

用户:

user_id
userdata1

基团:

group_id
groupdata1

链路

user_id
group_id

在链接列表中,为每个连接创建一个数据集。

因此,如果用户1在第2组和第3组中,则链接表将包含两个带有user_id的条目1.一个链接到group_id 2,一个链接到group_id 3.

要回到您的示例,从第2组获取所有用户的查询是:

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

这将输出位于其中一个组中的所有用户,一些用作重复项(这些用户是两个组的成员)。如果您想避免重复,请添加'GROUP BY user_id'

答案 2 :(得分:0)

正常规范 ,唯一可用的黑客,在这种情况下是 hack 正在使用LIKE的黑客攻击。

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

SQL:

SELECT id FROM users 
WHERE 
   groups LIKE '%,$group_id,%' 
   OR groups LIKE '%,$group_id' 
   OR groups LIKE '$group_id,%'

答案 3 :(得分:0)

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