目标:使用T2的JOIN更新T3的GROUP_CONCAT信息来更新T1。
这是表格结构的简化版本:
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和分组的理解可能存在缺陷。任何帮助将不胜感激!
答案 0 :(得分:1)
SELECT GROUP_CONCAT(title SEPARATOR '; ') FROM lecture_topics)
基本上将从字符串中的lecture_topics
表中返回标题 ALL 。这就是为什么您的SET
查询使用相同的字符串(包含所有标题)更新所有讲座的原因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`