Напиши 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` по таблице подписок для оптимизации.


Задайте вопрос нейросети

Не нашли ответ? Спросите ИИ — он подготовит развёрнутую статью.