我有以下两个表格场景:
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
... ...
答案 0 :(得分:1)
您应该在用户和群组之间建立多对多关系,(意味着,用户可能属于多个群组,而群组可以容纳多个用户)。
你可以通过3个表来做到这一点:
在 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功能。