MySQL UPDATE 与 GROUP_CONCAT 加入三个表

Posted

技术标签:

【中文标题】MySQL UPDATE 与 GROUP_CONCAT 加入三个表【英文标题】:MySQL UPDATE with GROUP_CONCAT joining three tables 【发布时间】:2019-03-09 20:41:27 【问题描述】:

目标:使用 T3 中的 GROUP_CONCAT 信息更新 T1,并在 T2 上进行 JOIN。

这是表结构的简化版本:

T1:xfer_lectures 相关字段:lecture_idtopics (我正在尝试使用为该讲座指定的主题的串联列表填充主题字段。)

T2:calendar_lecture_topics 相关字段:event_idtopic_id (T1.lecture_id = T2.event_id)

T3:演讲主题 相关字段:idtitle (T2.topic_id = T3.event_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 时,我失败了。我已经尝试了很多版本的更新查询,其中大部分都会产生错误。此查询作为有效查询运行,但使用主题表中所有主题的相同列表填充每个主题字段:

 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 语句包含 GROUP_BY 子句的版本,但我仍然为每条记录得到相同的主题列表,而不是每次讲座的两个或三个相关主题。例如:

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

我哪里出错了?我对复杂查询的经验并不丰富,因此我对 JOIN 和分组的理解可能存在缺陷。任何帮助将不胜感激!

【问题讨论】:

我认为你有一个错字:应该是:ON T1.lecture_id=T2.event_id,在 T1 和 T2 之间的 JOIN 条件中 感谢您发现我的错字,Madhur!我发现了另外几个我已经更正的地方。在此过程中,我更改了一些表名,并在原始问题中输入了错误的查询。不幸的是,语法仍然是错误的,所以虽然更正的版本有望使问题更清楚,但问题仍然存在。 【参考方案1】: SELECT GROUP_CONCAT(title SEPARATOR '; ') FROM lecture_topics) 基本上会以字符串形式返回lecture_topics 表中的ALL 标题。这就是为什么您的 SET 查询使用相同的字符串(包含所有标题)更新所有讲座 你基本上需要在这里使用Derived Table。在这个派生表中,您会根据event_id (lecture_id) 的分组获得标题。 现在,将这个表与xfer_lectures 连接到event_id = lecture_id,并使用派生表中的Group_concat() 结果更新xfer_lectures 表中的值。

试试这个:

 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` 

【讨论】:

宾果游戏!哦,天哪,谢谢你!我永远不会独自到达那里。不胜感激!我猜你会称之为嵌套连接?我显然有一些学习要做...... 感谢该链接重新派生表。这是一个我不知道的好工具。你太棒了!

以上是关于MySQL UPDATE 与 GROUP_CONCAT 加入三个表的主要内容,如果未能解决你的问题,请参考以下文章

mysql中的update(更新)与alter(更改)以及 change和modify的区别

mysql update与select结合修改表数据

mysql update语句与limit的结合使用

面试官:MySQL 中 update 更新,数据与原数据相同时会执行吗?大部分人答不上来!

MYSQL-update与select结合使用

MySQL UPDATE 与来自不同表的 SELECT SUM