Напиши SQL-запрос для автоматического поиска пользователей, у которых есть подписка, но баланс в таблице user_balances отрицательный.
## SQL-запрос для поиска пользователей с подпиской и отрицательным балансом
Для решения задачи необходимо объединить таблицу пользователей (или подписок) с таблицей балансов и отфильтровать записи, где баланс меньше нуля.
### Предположения о структуре таблиц
Предположим, что в базе данных есть следующие таблицы:
— **users** — основная таблица пользователей (поля: `id`, `email`, `name`)
— **subscriptions** — таблица подписок (поля: `user_id`, `status`, `expires_at`)
— **user_balances** — таблица балансов (поля: `user_id`, `balance`)
### Основной SQL-запрос
sql
SELECT
u.id AS user_id,
u.name AS user_name,
u.email AS user_email,
s.status AS subscription_status,
s.expires_at AS subscription_expires,
ub.balance AS current_balance
FROM users u
INNER JOIN subscriptions s
ON s.user_id = u.id
AND s.status = ‘active’
INNER JOIN user_balances ub
ON ub.user_id = u.id
WHERE ub.balance < 0
ORDER BY ub.balance ASC;
### Пояснение логики запроса
1. **INNER JOIN subscriptions** — соединяем только тех пользователей, у которых есть запись в таблице подписок со статусом `'active'`. Если статус хранится иначе (например, `1` или `true`), замените условие соответственно.
2. **INNER JOIN user_balances** — присоединяем таблицу балансов по `user_id`.
3. **WHERE ub.balance = CURRENT_DATE
INNER JOIN user_balances ub
ON ub.user_id = u.id
WHERE ub.balance < 0;
### Строка для CSV
Чтобы сразу получить результат в формате, пригодном для экспорта в CSV, можно использовать конкатенацию (пример для PostgreSQL):
sql
SELECT
u.id || ',' ||
u.name || ',' ||
u.email || ',' ||
s.status || ',' ||
ub.balance AS csv_row
FROM users u
INNER JOIN subscriptions s ON s.user_id = u.id AND s.status = 'active'
INNER JOIN user_balances ub ON ub.user_id = u.id
WHERE ub.balance < 0;
Эта версия возвращает каждую строку в виде одной CSV-строки вида: `42,Иван Петров,ivan@example.com,active,-350.00`
Для MySQL вместо `||` используйте функцию `CONCAT()`.
### Рекомендации
— Добавьте индексы на `user_id` в обеих дочерних таблицах для ускорения JOIN.
— Если пользователей много, рассмотрите использование `EXISTS` вместо `INNER JOIN` по таблице подписок для оптимизации.
