用PHP和MySQL创建一组用户

时间:2011-09-06 14:54:57

标签: php mysql join group-by

我想知道如何使用JOIN或LEFT JOIN来分组用户。

用户表:

id (primary)
user (varchar)
pass (varchar)
email (varchar)
website (varchar)
bio (text)
avatar (varchar)
code (varchar)
active (varchar)
admin (varchar)
group_1 (int) <--- I have a feeling that this is the wrong way to go about it
group_2 (int) <---
group_3 (int) <---

分组表:

group_id (primary key)
group_name (varchar)
group_bio (text)
group_website (varchar)

我想知道如何让一名成员参与多个小组并显示某个小组的成员名单。

这样的事情:

Group Name
Users: <a href='profile'>Name</a>, <a href='profile'>Name</a>, <a href='profile'>Name</a>, <a href='profile'>Name</a>

我完全不知道如何解决这个问题。请帮忙。

3 个答案:

答案 0 :(得分:7)

您需要标准many-to-many relationship

这通常通过三个表来实现。

  1. 用户
  2. 成员
  3. Memberships表将有两个外键,映射到另外两个表。

答案 1 :(得分:2)

您必须使用两个字段创建新表 MEMBER_GROUPS user_id group_id
每一行都是用户的成员资格......
通过这种方式,您可以轻松查询组中的用户成员资格......

答案 2 :(得分:1)

这确实是错误的方法,因为它将用户限制为三个组成员身份。这是一个典型的多对多关系,您可以使用桥接表对其进行建模:

user_group
----------
user_id
group_id

主键将是user_idgroup_id的组合,强制实现唯一性。然后你会通过这个表进行双连接。例如,要获取所有组的所有成员:

SELECT group.*, user.*
FROM group
LEFT OUTER JOIN user_group
ON group.group_id = user_group.group_id
LEFT OUTER JOIN user
ON user_group.user_id = user.user_id

或者,如果您在特定群体之后:

SELECT user.*
FROM user_group
INNER JOIN user
ON user_group.user_id = user.user_id
WHERE user_group.group_id = ?

您甚至可以获得所有群组的列表,其中包含会员数:

SELECT group.*, COUNT(user_group.user_id) AS group_membership_count
FROM group
LEFT OUTER JOIN user_group
ON user_group.group_id = group.group_id
GROUP BY group.group_id