@HazeFaze

Как исключить из выборки, группу записей с одним ID при выполнении условия?

Всем привет! Я только учу sql, поэтому вопрос может показаться тупым как на состав задачи, так и формулировку :D (Заранее извиняюсь) Вопрос вот в чем.
Имеется 4 таблицы:
game g, account a, transactions t, company c
Нужно вывести все логины пользователей которые имеют в аккаунте игры ТОЛЬКО созданные в США в четный год. Если на логине имеется хотя бы одно игра выпущенная в нечетный год или не в США, логин нужно пропустить.
Мой запрос:
select a.login
from account a
join company c
join transactions t
join game g
on a.id = t.account_id and c.id = g.Developer and t.game_id = g.id
where c.country = 'USA'
and mod(year(g.Release_date), 2) = 0
group by a.login

То есть, мой запрос показывает все аккаунты, с наличием хотя бы одного совпадения ГОД-СТРАНА.
Как возможно исключить из выборки аккаунты которые имеют хотя бы одно исключения?
Заранее благодарю,

Развертка БД
60a36591a0517782688281.png
  • Вопрос задан
  • 655 просмотров
Решения вопроса 1
@Akina
Сетевой и системный админ, SQL-программист.
SELECT a.login
FROM account a
JOIN transactions t ON a.id = t.account_id
JOIN game g ON t.game_id = g.id
JOIN company c ON c.id = g.Developer
GROUP BY a.login
HAVING !SUM( c.country != 'USA' OR YEAR(g.Release_date) MOD 2 )


Т.е. сперва собираем всю информацию в одну кучу, а потом для каждого логина считаем количество игр, у которых либо страна не штаты, либо год нечётный, и оставляем лишь записи, где это количество нулевое.

Как работает?

Если в данной совокупной записи страна - штаты, то c.country != 'USA' есть FALSE, что в числовом контексте есть ноль, а иначе TRUE и соответственно единица.

Если в данной совокупной записи год чётный, то YEAR(g.Release_date) MOD 2 есть ноль, а иначе единица.

Итого в скобках получаем единицу, если хотя бы одно из условий TRUE.

Далее - суммируем все единицы, фактически подсчитывая количество отдельных неподходящих под критерий записей для логина.

Ну и затем инвертируем (восклицательный знак - это оператор NOT). Соответственно если сумма ненулевая, получаем после инверсии ноль, который интерпретируется как FALSE, а если нулевая, то после инверсии получаем единицу, которая TRUE.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы