Video Series Management

Manage video series with episodes, seasons, and sequential ordering

All recipes· video-streaming· 12 minutesintermediate

Video Series Management

Objective

Create a system for managing video series with seasons and episodes. This pattern supports episodic content, course modules, and serialized video delivery.

Step 1: Create Series Table

Create a table for video series.

CREATE TABLE video_series (
    id INTEGER PRIMARY KEY,
    title VARCHAR(255) NOT NULL,
    description TEXT,
    cover_image IMAGE(JPEG),
    series_type VARCHAR(50) DEFAULT 'series',
    total_seasons INTEGER DEFAULT 1,
    total_episodes INTEGER DEFAULT 0,
    status VARCHAR(20) DEFAULT 'ongoing',
    genre VARCHAR(50),
    creator VARCHAR(100),
    release_date DATE,
    last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Step 2: Create Seasons Table

Create a table for seasons within series.

CREATE TABLE series_seasons (
    id INTEGER PRIMARY KEY,
    series_id INTEGER NOT NULL,
    season_number INTEGER NOT NULL,
    title VARCHAR(255),
    description TEXT,
    episode_count INTEGER DEFAULT 0,
    release_date DATE,
    is_complete BOOLEAN DEFAULT FALSE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (series_id) REFERENCES video_series(id)
);

Step 3: Create Episodes Table

Create a table for individual episodes.

CREATE TABLE series_episodes (
    id INTEGER PRIMARY KEY,
    series_id INTEGER NOT NULL,
    season_id INTEGER NOT NULL,
    episode_number INTEGER NOT NULL,
    title VARCHAR(255) NOT NULL,
    description TEXT,
    video_file VIDEO(MP4),
    thumbnail IMAGE(JPEG),
    duration_seconds INTEGER,
    release_date DATE,
    view_count INTEGER DEFAULT 0,
    is_premium BOOLEAN DEFAULT FALSE,
    is_published BOOLEAN DEFAULT TRUE,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (series_id) REFERENCES video_series(id),
    FOREIGN KEY (season_id) REFERENCES series_seasons(id)
);

Step 4: Insert Sample Series

Add sample video series.

INSERT INTO video_series (id, title, description, series_type, total_seasons, status, genre, creator, release_date) VALUES
    (1, 'Learn Python Programming', 'Complete Python course from basics to advanced', 'course', 3, 'completed', 'Education', 'Tech Academy', '2024-01-01'),
    (2, 'Web Development Bootcamp', 'Full-stack web development series', 'course', 2, 'ongoing', 'Education', 'Code Masters', '2024-02-15'),
    (3, 'Tech Talk Weekly', 'Weekly technology news and discussions', 'series', 1, 'ongoing', 'Technology', 'Tech News Team', '2024-01-10'),
    (4, 'Startup Stories', 'Documentary series about successful startups', 'documentary', 2, 'completed', 'Business', 'Startup Media', '2023-06-01');

Step 5: Insert Seasons

Add seasons to series.

INSERT INTO series_seasons (id, series_id, season_number, title, description, episode_count, release_date, is_complete) VALUES
    -- Python course seasons
    (1, 1, 1, 'Python Fundamentals', 'Basic Python concepts and syntax', 10, '2024-01-01', TRUE),
    (2, 1, 2, 'Intermediate Python', 'OOP, modules, and file handling', 8, '2024-02-01', TRUE),
    (3, 1, 3, 'Advanced Python', 'Decorators, generators, and async', 6, '2024-03-01', TRUE),
    -- Web Dev seasons
    (4, 2, 1, 'Frontend Basics', 'HTML, CSS, and JavaScript', 12, '2024-02-15', TRUE),
    (5, 2, 2, 'Backend Development', 'Server-side programming', 8, '2024-04-01', FALSE),
    -- Tech Talk season
    (6, 3, 1, '2024 Episodes', 'Weekly episodes for 2024', 20, '2024-01-10', FALSE),
    -- Startup Stories seasons
    (7, 4, 1, 'Tech Giants Origins', 'How tech giants started', 5, '2023-06-01', TRUE),
    (8, 4, 2, 'Rising Stars', 'New startups to watch', 4, '2023-09-01', TRUE);

Step 6: Insert Episodes

Add episodes to seasons.

INSERT INTO series_episodes (id, series_id, season_id, episode_number, title, description, duration_seconds, release_date, view_count, is_premium) VALUES
    -- Python Fundamentals episodes
    (1, 1, 1, 1, 'Introduction to Python', 'What is Python and why learn it', 900, '2024-01-01', 50000, FALSE),
    (2, 1, 1, 2, 'Variables and Data Types', 'Working with variables', 1200, '2024-01-03', 45000, FALSE),
    (3, 1, 1, 3, 'Control Flow', 'If statements and loops', 1500, '2024-01-05', 42000, FALSE),
    (4, 1, 1, 4, 'Functions', 'Creating and using functions', 1800, '2024-01-07', 38000, FALSE),
    (5, 1, 1, 5, 'Lists and Tuples', 'Working with sequences', 1400, '2024-01-09', 35000, FALSE),
    -- Intermediate Python episodes
    (6, 1, 2, 1, 'Object-Oriented Programming', 'Classes and objects', 2100, '2024-02-01', 28000, TRUE),
    (7, 1, 2, 2, 'Inheritance', 'Class inheritance patterns', 1800, '2024-02-04', 25000, TRUE),
    (8, 1, 2, 3, 'Modules and Packages', 'Organizing code', 1500, '2024-02-07', 23000, TRUE),
    -- Frontend Basics episodes
    (9, 2, 4, 1, 'HTML Fundamentals', 'HTML structure and tags', 1200, '2024-02-15', 35000, FALSE),
    (10, 2, 4, 2, 'CSS Basics', 'Styling web pages', 1500, '2024-02-18', 32000, FALSE),
    (11, 2, 4, 3, 'CSS Layouts', 'Flexbox and Grid', 1800, '2024-02-21', 30000, FALSE),
    (12, 2, 4, 4, 'JavaScript Intro', 'Getting started with JS', 1600, '2024-02-24', 28000, FALSE);

Step 7: Update Episode Counts

Calculate episode totals.

UPDATE series_seasons
SET episode_count = (
    SELECT COUNT(*) FROM series_episodes
    WHERE series_episodes.season_id = series_seasons.id
);

UPDATE video_series
SET total_episodes = (
    SELECT COUNT(*) FROM series_episodes
    WHERE series_episodes.series_id = video_series.id
);

SELECT title, total_seasons, total_episodes FROM video_series;

Step 8: Get Series Overview

Get complete series information.

SELECT
    vs.title as series,
    vs.series_type,
    vs.total_seasons,
    vs.total_episodes,
    vs.status,
    vs.genre
FROM video_series vs
ORDER BY vs.title;

Step 9: Get Season Episodes

List all episodes in a season.

SELECT
    se.episode_number,
    se.title,
    se.duration_seconds / 60 as minutes,
    se.view_count,
    se.is_premium,
    se.release_date
FROM series_episodes se
WHERE se.season_id = 1
ORDER BY se.episode_number;

Step 10: Series Progress Tracking

Get series with watch statistics.

SELECT
    vs.title,
    ss.season_number,
    ss.title as season_title,
    ss.episode_count,
    SUM(se.view_count) as total_views,
    SUM(se.duration_seconds) / 3600 as total_hours
FROM video_series vs
INNER JOIN series_seasons ss ON vs.id = ss.series_id
LEFT JOIN series_episodes se ON ss.id = se.season_id
GROUP BY vs.id, vs.title, ss.id, ss.season_number, ss.title, ss.episode_count
ORDER BY vs.title, ss.season_number;

Step 11: Find Next Episode

Get next unwatched episode (simulated).

SELECT
    vs.title as series,
    'S' || ss.season_number || 'E' || se.episode_number as episode_code,
    se.title as episode_title,
    se.duration_seconds / 60 as minutes
FROM video_series vs
INNER JOIN series_seasons ss ON vs.id = ss.series_id
INNER JOIN series_episodes se ON ss.id = se.season_id
WHERE vs.id = 1
  AND se.is_published = TRUE
ORDER BY ss.season_number, se.episode_number
LIMIT 1;

Step 12: Popular Episodes

Find most viewed episodes across all series.

SELECT
    vs.title as series,
    'S' || ss.season_number || 'E' || se.episode_number as code,
    se.title as episode,
    se.view_count,
    se.is_premium
FROM series_episodes se
INNER JOIN series_seasons ss ON se.season_id = ss.id
INNER JOIN video_series vs ON se.series_id = vs.id
ORDER BY se.view_count DESC
LIMIT 10;

Cleanup (Optional)

DROP TABLE IF EXISTS series_episodes;
DROP TABLE IF EXISTS series_seasons;
DROP TABLE IF EXISTS video_series;

Expected Outcomes

  • Series with seasons created
  • Episodes organized sequentially
  • View counts tracked
  • Progress navigation works
  • Premium content flagged

Series Types

Type Description
series Ongoing episodic content
course Educational series
documentary Documentary series
miniseries Limited episode series

Key Concepts Learned

  • Series-season-episode hierarchy
  • Sequential episode ordering
  • Progress tracking queries
  • View statistics aggregation
  • Premium content management

Tags

sqlintermediatevideoseriesepisodesseasonsordering

Run this on your own machine

Install SynapCores Community Edition free, paste the SQL or Cypher above into the bundled web UI, and watch it run.

Download Free CE