#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 . , , я запутался в структуре данных. Я вижу, что вы хотите сейчас, и скорректировал запрос (и добавил скрипку, чтобы убедиться, что она работает).