【发布时间】:2019-03-09 20:41:27
【问题描述】:
目标:使用 T3 中的 GROUP_CONCAT 信息更新 T1,并在 T2 上进行 JOIN。
这是表结构的简化版本:
T1:xfer_lectures
相关字段:lecture_id、topics
(我正在尝试使用为该讲座指定的主题的串联列表填充主题字段。)
T2:calendar_lecture_topics
相关字段:event_id、topic_id
(T1.lecture_id = T2.event_id)
T3:演讲主题
相关字段:id、title
(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!我发现了另外几个我已经更正的地方。在此过程中,我更改了一些表名,并在原始问题中输入了错误的查询。不幸的是,语法仍然是错误的,所以虽然更正的版本有望使问题更清楚,但问题仍然存在。
标签: mysql join sql-update concat group-concat