SQL:外键具有多个子值

时间:2014-05-07 05:20:49

标签: php mysql sql database-table

如何设置与用户列表具有以下关系的组表:

例如,假设我有用户表:

              user_list
-----------------------------------
first_name | Last Name  | user_id |
-----------------------------------
   john    | Appleseed  |  4      |
   Jasmin  | Applejuice |  6      |

现在我要创建一个组表。如何创建一个表,用户可以将其包含在一个组或多个组中。例如,John包含在Apple_group中,但也包含在Orage_group中。 Jasmin仅包含在Orange_group

                        groups
----------------------------------------------------
   group_name    | included_users_ids  | group_id  |
----------------------------------------------------
   Apple_group   |       4             |   1       |
   Orange_group  |       4, 6          |   6       |

假设user_list表已经存在,我将如何设置groups表?此外,我已阅读(请参阅下面的链接),我不应在一列中包含多个值。

Inserting a foreign key with multiple values

所以,我的问题是:

  1. 设置群组表的适当方法是什么?

  2. SQL会这样做什么?

  3. 当想要将用户设置为群组时,如何使用PHP处理?

1 个答案:

答案 0 :(得分:1)

您需要创建第三个表,称为“连接表”。

users (
  id,
  name
);

groups (
  id,
  first_name,
  last_name
);

groups_to_users (
  user_id,
  group_id
);

然后在groups_to_users表中为用户所属的每个组创建一个条目(或者,您可以用另一种方式说明,为组中的每个用户创建一个条目)。这是一个n:n关系(多对多)。如果您搜索“数据库规范化”,正如我在回答上一个问题时提到的那样,您将了解所有这些内容。

如果您想获得所有用户的群组,您可以执行以下操作:

SELECT g.* FROM groups_to_users gtu
LEFT JOIN groups g ON gtu.group_id=g.id
WHERE gtu.user_id = :UserId

如果您想获得某个群组的用户,请执行以下操作:

SELECT u.* FROM groups_to_users gtu
LEFT JOIN users u ON gtu.user_id=u.id
WHERE gtu.group_id = :GroupId