У меня есть 3 таблицы в базе данных
1) видео.
id name 1 one 2 two 3 three
2) session_has_video.
session_id video_id 1 1 1 3
3) channel_has_session.
channel_id session_id videos 1 1
Я хочу обновить channel_has_session.videos
со всеми video.id
где video.id
находится в session.session_id
. Это означает, что он должен быть 1,3
Итак, обновленная таблица должна выглядеть так:
channel_has_session.
channel_id session_id videos 1 1 1,3
Я попробовал этот запрос, но явно не работал.
update channel_has_session set videos = ( SELECT video_id FROM session_has_video where session_id=1 ) where session_id=1 and channel_id=1
Есть ли простой способ сделать это в MySQL?
Вы можете присоединиться к таблице channel_has_session
во временную таблицу, содержащую каждый session_id
вместе с разделенным запятыми video_id
значений video_id
. Затем выполните SET
в таблице channel_has_session
используя этот список CSV. Попробуйте этот запрос:
UPDATE channel_has_session AS ch INNER JOIN ( SELECT session_id, GROUP_CONCAT(video_id) AS videos FROM session_has_video GROUP BY session_id ) AS t on ch.session_id = t.session_id SET ch.videos = t.videos WHERE ch.channel_id = 1 AND ch.session_id = 1
Одним из способов достижения этой цели можно воспользоваться group_concat()
:
UPDATE channel_has_session SET videos = ( SELECT GROUP_CONCAT(DISTINCT video_id SEPARATOR ',') FROM session_has_video WHERE session_id = 1 ) WHERE session_id = 1 AND channel_id = 1
Но, как сказано, использование разделенных запятыми значений в вашей базе данных не рекомендуется.