目标是:用组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`)
我哪里出错了?我对复杂的查询没有太多的经验,所以我对连接和分组的理解可能有缺陷。任何帮助都将不胜感激!
1条答案
按热度按时间yzckvree1#
SELECT GROUP_CONCAT(title SEPARATOR '; ') FROM lecture_topics)
将基本上返回所有的标题从lecture_topics
字符串中的表。这就是为什么你SET
查询正在更新具有相同字符串的所有讲座(包含所有标题)这里基本上需要使用派生表。在这个派生表中,可以根据
event_id
(lecture_id
).现在,把这张table和
xfer_lectures
在event_id
=lecture_id
,并使用Group_concat()
来自派生表的结果,以更新中的值xfer_lectures
table。试试这个: