php - SQL:具有多个子值的外键

标签 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 处理此问题?

最佳答案

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

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

关于php - SQL:具有多个子值的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23509334/

相关文章:

php - Symfony2 事件监听器作为服务

mysql - 按降序选择每第 n 行

sql - 如何从 PostgreSQL 中没有任何条件的表中删除前几条记录?

SQL - 从带有约束的表中删除行

php strpos 不返回任何值

php - 将用户重定向到 MediaWiki wiki 的移动 View

php - 尝试使用 PDO 在 PHP 中搜索 MySQL 数据库

mysql UNION 命名表属性

mysql - 当 WHERE 子句中的 id 来自上一行时选择数据

php - 可以让MySQL在某些条件下忽略连接吗?