Я бы просто сделал это, переместив условие в предложение having
:
SELECT dgc.name, dgc.id, dgc.has_special
FROM keyword k JOIN
d_gift_card dgc
ON k.gc_id = dgc.id
GROUP BY dgc.name, dgc.id, dgc.has_special
HAVING SUM( keyword IN ('red') ) = 0;
Обратите внимание, что предложение GROUP BY
соответствует неагрегированным столбцам SELECT
. Это лучшая практика, и в большинстве случаев она требуется стандартом SQL.
Выражение в предложении HAVING
подсчитывает количество строк, равное 'red'
. = 0
говорит, что их нет.
Наиболее эффективный способ написания запроса:
SELECT dgc.name, dgc.id, dgc.has_special
FROM d_gift_card dgc
WHERE NOT EXISTS (SELECT 1
FROM keyword k
WHERE k.gc_id = dgc.id AND k.keyword IN ('red')
);
Это может использовать индекс на keyword(gc_id, keyword)
и не требует агрегирования вообще.