我有两个表:
用户表
-------------------------
| 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
请提出一些实现它的方法?
答案 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)";