使用MySQL更新查询设置另一个表的ID字段。

3

I have 3 tables in database

1) videos.

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更新为session.session_id中包含的video.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中有没有更简单的方法来做像这样的操作?


1
我在你的问题中没有看到“钻孔”列的提及。我还要说的是,你应该避免在表格中使用逗号分隔的值,这会使你的数据库非关系型(通常是不好的事情)。 - Tim Biegeleisen
2个回答

2

您可以将channel_has_session表与一个临时表连接,该临时表包含每个session_id及其逗号分隔的video_id值列表。然后在channel_has_session表上执行SET操作,使用此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

是的,它对我有效,有没有办法仅更新特定记录,例如 where channel_id=1 and session_id=1 - himanshu archirayan

0

你可以使用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

但是,正如所说的那样,在数据库中使用逗号分隔的值是不被鼓励的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接