mysql更新,groupconcat连接三个表

ycggw6v2  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(321)

目标是:用组concat信息更新t1,从t3更新为跨t2的join。
下面是表结构的简化版本:
t1:xfer\U讲座
相关领域: lecture_id , topics (我正在尝试用为该讲座指定的主题的串联列表填充“主题”字段。)
t2:日历\讲座\主题
相关领域: event_id , topic_id (t1.讲座\u id=t2.事件\u id)
t3:讲座主题
相关领域: id , title (t2.topic\u id=t3.event\u id)
我可以通过以下查询成功选择所需信息:

SELECT 
    T1.`lecture_id`, GROUP_CONCAT(DISTINCT `title` SEPARATOR '; '), COUNT(*)
FROM
    `xfer_lectures` T1
    INNER JOIN
        `calendar_lecture_topics` T2
    INNER JOIN
        `lecture_topics` T3 
    ON T1.`lecture_id` = T2.`event_id`
    AND T2.`topic_id` = T3.`id`
    GROUP BY T1.`lecture_id`

然而,当我尝试用连接的信息更新t1时,我失败了。我尝试过更新查询的许多版本,其中大多数都会产生错误。此查询作为有效查询运行,但会使用topics表中所有主题的相同列表填充每个主题字段:

UPDATE 
    `xfer_lectures` T1
 JOIN `calendar_lecture_topics` T2
    ON T1.`lecture_id`=T2.`event_id`
 JOIN `lecture_topics` T3
    ON T2.`topic_id` = T3.`id`
 SET T1.`topics` = (
    SELECT 
    GROUP_CONCAT(`title` SEPARATOR '; ')
    FROM `lecture_topics`
    )

我也尝试过select语句包含groupby子句的版本,但是我仍然得到了每个记录的相同主题列表,而不是每个讲座的两到三个相关主题。例如:

SET T1.`topics` = (       
SELECT        
GROUP_CONCAT(`title` SEPARATOR '; ')       
FROM `lecture_topics`
WHERE T2.`topic_id` = T3.`id` 
AND T1.`lecture_id`=T2.`event_id`
GROUP BY T2.`event_id`)

我哪里出错了?我对复杂的查询没有太多的经验,所以我对连接和分组的理解可能有缺陷。任何帮助都将不胜感激!

yzckvree

yzckvree1#

SELECT GROUP_CONCAT(title SEPARATOR '; ') FROM lecture_topics) 将基本上返回所有的标题从 lecture_topics 字符串中的表。这就是为什么你 SET 查询正在更新具有相同字符串的所有讲座(包含所有标题)
这里基本上需要使用派生表。在这个派生表中,可以根据 event_id ( lecture_id ).
现在,把这张table和 xfer_lecturesevent_id = lecture_id ,并使用 Group_concat() 来自派生表的结果,以更新中的值 xfer_lectures table。
试试这个:

UPDATE 
    `xfer_lectures` AS T1
 JOIN ( SELECT 
          T2.`event_id`, 
          GROUP_CONCAT(T3.`title` SEPARATOR '; ') as `topics`
        FROM `calendar_lecture_topics` AS T2 
        JOIN `lecture_topics` AS T3 
          ON T2.`topic_id` = T3.`id` 
        GROUP BY T2.`event_id`
       ) AS T4 ON T4.`event_id` = T1.`lecture_id` 
 SET T1.`topics` = T4.`topics`

相关问题