Пользователи без поездок

27. Найти пользователей без поездок

Условие задачи:
Есть таблицы:

CREATE TABLE users (
    id INT8 PRIMARY KEY,
    name TEXT,
    email TEXT
);

CREATE TABLE trips (
    id INT8 PRIMARY KEY,
    scooter INT8,
    user_id INT8,
    started_at TIMESTAMPTZ,
    finished_at TIMESTAMPTZ
);

CREATE TABLE pauses (
    id INT8 PRIMARY KEY,
    trip_id INT8,
    started_at TIMESTAMPTZ,
    finished_at TIMESTAMPTZ
);

Необходимо вывести id всех пользователей, у которых нет ни одной поездки в таблице trips.


Спойлеры к решению

Подсказки
💡 Можно использовать LEFT JOIN, чтобы сохранить всех пользователей.
💡 Если у пользователя нет поездок, соответствующая запись из trips будет отсутствовать.
💡 Альтернативный вариант — проверить отсутствие поездок через NOT EXISTS.

Решение

Вариант через LEFT JOIN:

SELECT u.id
FROM users u
LEFT JOIN trips t
    ON t.user_id = u.id
WHERE t.id IS NULL;

LEFT JOIN сохраняет всех пользователей. Для пользователей без поездок поля таблицы trips будут равны NULL, поэтому условие:

WHERE t.id IS NULL

оставляет только их.

Альтернативный вариант через NOT EXISTS:

SELECT u.id
FROM users u
WHERE NOT EXISTS (
    SELECT 1
    FROM trips t
    WHERE t.user_id = u.id
);

Оба варианта корректно возвращают пользователей, у которых нет ни одной поездки.

Таблица pauses для решения этой задачи не требуется.