Как суммировать время из нескольких подключенных таблиц?

#mysql #sql #database

#mysql #sql #База данных

Вопрос:

Я пытаюсь найти продолжительность онлайн-курса, складывая отдельные длины уроков вместе. Однако каждый урок принадлежит главе, которая, в свою очередь, принадлежит курсу.

 Course table
| course_id | name | date | ...

Chapter table
| chapter_id | course_id | name |

Lesson table
| lesson_id | chapter_id | name | length |
 

Если lesson бы таблица была напрямую связана с course таблицей, я бы просто использовал следующее:

 SELECT SEC_TO_TIME( SUM( TIME_TO_SEC( `length` ) ) ) AS totaltime 
                    FROM lesson 
                    WHERE course_id = 'WEB001'
 

Как я могу суммировать длины всех уроков, принадлежащих курсу, просматривая chapter таблицу?

PS Атрибут ‘length’ имеет тип ‘time’

Ответ №1:

Просто установите адекватные отношения внутри ваших данных.

Разбирая вещи по частям, давайте сначала выберем нужные вам данные:

 SELECT c.*, ch.chapter_id, ch.name, l.lesson_id, l.`length`
FROM course AS c
    INNER JOIN chapter AS ch ON c.course_id = ch.course_id
    INNER JOIN lesson AS l ON ch.chapter_id = l.chapter_id
WHERE c.course_id = 'WEB001'
 

Как вы можете видеть, у вас есть все необходимые данные.

Теперь ваш запрос довольно очевиден:

 SELECT SUM( TIME_TO_SEC( l.`length` ) AS totaltime 
FROM course AS c
    INNER JOIN chapter AS ch ON c.course_id = ch.course_id
    INNER JOIN lesson AS l ON ch.chapter_id = l.chapter_id
WHERE c.course_id = 'WEB001'
 

Комментарии:

1. Спасибо, это сработало, просто пришлось убрать лишнюю закрывающую скобку.

Ответ №2:

Вы можете использовать коррелированный подзапрос:

 SELECT c.*,
       SEC_TO_TIME( (SELECT SUM( TIME_TO_SEC( `length` ))
                     FROM lesson l JOIN
                          chapter ch
                          ON l.chapter_id = ch.chapter_id
                     WHERE ch.course_id = c.course_id
                    )
                  )  AS totaltime 
FROM course c;
 

Вот db<>скрипка.

Комментарии:

1. @aatj . , , я запутался в структуре данных. Я вижу, что вы хотите сейчас, и скорректировал запрос (и добавил скрипку, чтобы убедиться, что она работает).