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 для решения этой задачи не требуется.