Таблицы ассоциаций (Junction) с использованием mysql и php - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть две таблицы:

  • таблица пользователя: user_id, имя
  • таблица курса: course_id, содержимое

userтаблица

-------------------------
| 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

Подскажите, пожалуйста, как этого добиться?

Ответы [ 5 ]

0 голосов
/ 09 февраля 2019

Наконец, я получил результат - объединил использование insert ... select с cross join

Вот код для таблицы соединений:

$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)";
0 голосов
/ 08 февраля 2019

Вы можете использовать кросс-соединение, чтобы получить результат, который вы ищете:

INSERT INTO user_course
SELECT * FROM user CROSS JOIN course;
0 голосов
/ 08 февраля 2019

Вы можете использовать оператор INSERT .. SELECT , чтобы присоединить все существующие курсы к пользователю.

Например (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
0 голосов
/ 08 февраля 2019

A many: для многих таблиц обычно требуется 2 столбца - идентификаторы для двух таблиц, с которыми она связана.Не включайте избыточно имена и т. Д., Которые уже существуют в этих двух таблицах.

Это также требует (в вашем примере)

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

Они позволяют эффективно сопоставлять пользователей с курсами инаоборот.

Я обсуждаю такие таблицы далее в здесь

0 голосов
/ 06 февраля 2019

Это правильно.

Если в каком-либо курсе могут быть зарегистрированы какие-либо пользователи, вы можете создать таблицу с именем users_courses, которая разрешает отношение N: N, используя приведенную вами схему.

Таким образом, вы позволяете пользователю не иметь ни одного курса, ни одного курса или даже всех курсов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...