使用mysql和php的Association(Junction)表

时间:2019-02-06 11:51:30

标签: php mysql sql database many-to-many

我有两个表:

  • 用户表:user_id,名称
  • 课程表:course_id,内容

用户表

-------------------------
| user_id | name        |
-------------------------
| 1       | x           |
-------------------------
| 2       | y           |
-------------------------

课程表

------------------------------
| course_id | content        |
------------------------------
| 1         | a              |
------------------------------
| 2         | b              |
------------------------------
| 3         | c              |
------------------------------

如何将用户表中的每一行与课程表中的所有行相关联?

我要关联如下所示:

----------------------------------------
| user_id | name | course_id | content |
----------------------------------------
| 1       | x    | 1         | a       |
----------------------------------------
| 1       | x    | 2         | b       |
----------------------------------------
| 1       | x    | 3         | c       |
----------------------------------------
| 2       | y    | 1         | a       |
----------------------------------------
| 2       | y    | 2         | b       |
----------------------------------------
| 2       | y    | 3         | c       |
----------------------------------------

我创建了一个关联(连接)表user_course:user_id和course_id,但不知道如何填充

我用于插入的代码如下所示:

$query = "INSERT INTO user_course ( user_id, course_id ) VALUES ( :user_id, :course_id )";
$pdo_statement = $pdo_conn->prepare( $query );
$result = $pdo_statement->execute( array( ':user_id'=> $last_insert_id , ':course_id'=> $ids ) );
  

注意:$ last_insert_id是用户注册的,但如何获取所有   $ ids中的课程ID

请提出一些实现它的方法?

5 个答案:

答案 0 :(得分:4)

您可以使用交叉联接获得所需的结果:

INSERT INTO user_course
SELECT * FROM user CROSS JOIN course;

答案 1 :(得分:2)

您可以使用INSERT .. SELECT statement将所有现有课程附加到用户。

例如(SQL):

INSERT INTO user_course (user_id, course_id) 
SELECT FROM <user_id>, course_id FROM course

例如(PHP):

$query = "INSERT INTO user_course (user_id, course_id) SELECT :user_id, course_id FROM course";
$pdo_statement = $pdo_conn->prepare($query);
$result = $pdo_statement->execute(array(':user_id'=> $last_insert_id));

如果要将所有课程附加到所有用户,则可以使用以下查询

INSERT INTO user_course (user_id, course_id) 
SELECT FROM user.user_id, course.course_id FROM user, course

答案 2 :(得分:0)

那是正确的。

如果可以在任何课程中注册任何用户,则可以使用您举例说明的模式,创建一个名为users_courses的表,该表允许N:N关系。

通过这种方式,您允许用户没有任何课程,一门课程甚至所有课程。

答案 3 :(得分:0)

很多:许多表通常需要2列-与它关联的两个表中的ID。不要多余地包含两个表中已经存在的名称等。

(在您的示例中)它也需要

PRIMARY KEY(user_id, course_id),
INDEX(course_id, user_id)

这些功能使您可以有效地从用户映射到课程,反之亦然。

我将在here

中进一步讨论此类表格

答案 4 :(得分:0)

最后我得到了结果-结合使用插入...选择交叉连接

这是联结表的代码:

$id = lastInsertId;
$query = "INSERT INTO user_course ( user_id, course_id ) ( SELECT A.user_id, B.course_id FROM user A CROSS JOIN course B WHERE A.user_id = $id)";