ОБНОВЛЕНИЕ MySQL с GROUP_CONCAT, соединяющим три таблицы - PullRequest
0 голосов
/ 04 октября 2018

Цель: обновить T1 с информацией GROUP_CONCAT из T3 с JOIN через T2.

Вот упрощенная версия структур таблиц:

T1: xfer_lectures Соответствующие поля: lecture_id, topics(Я пытаюсь заполнить поле тем составным списком тем, предназначенных для этой лекции.)

T2: calendar_lecture_topics Соответствующие поля: event_id, topic_id(T1.lecture_id = T2.event_id)

T3: lecture_topics Соответствующие поля: 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, так и группирования, вероятно, неверно.Любая помощь будет высоко ценится!

1 Ответ

0 голосов
/ 04 октября 2018
  • SELECT GROUP_CONCAT(title SEPARATOR '; ') FROM lecture_topics) в основном вернет ALL заголовки из таблицы lecture_topics в строке.Вот почему ваш запрос 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` 
...