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

    @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.
    Ответ написан
    3 комментария