Соедините campaigns → ads → creatives и сгруппируйте по кампании с HAVING COUNT(cr.id) >= 2. Считать нужно креативы по всем объявлениям кампании, а не число самих объявлений.
Кампании, содержащие минимум два креатива
Соедините campaigns → ads → creatives и сгруппируйте по кампании с HAVING COUNT(cr.id) >= 2. Считать нужно креативы по всем объявлениям кампании, а не число самих объявлений.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Получить список рекламных кампаний, в которых присутствует два и более креативов.
CREATE TABLE campaigns (
id INT PRIMARY KEY,
name VARCHAR(128) NOT NULL,
start_date DATE NOT NULL DEFAULT CURRENT_TIMESTAMP,
end_date DATE NOT NULL
);
CREATE TABLE ads (
id INT PRIMARY KEY,
name VARCHAR(128) NOT NULL,
type VARCHAR(64) NOT NULL,
cost INT NOT NULL,
campaing_id INT REFERENCES campaigns(id)
);
CREATE TABLE creatives (
id INT PRIMARY KEY,
picture VARCHAR(256) NOT NULL,
ads_id INT REFERENCES ads(id)
);
Ответ
Соедините campaigns → ads → creatives и сгруппируйте по кампании с HAVING COUNT(cr.id) >= 2. Считать нужно креативы по всем объявлениям кампании, а не число самих объявлений.
Запрос сохраняет написание campaing_id из предоставленной схемы:
SELECT c.id, c.name
FROM campaigns AS c
JOIN ads AS a ON a.campaing_id = c.id
JOIN creatives AS cr ON cr.ads_id = a.id
GROUP BY c.id, c.name
HAVING COUNT(cr.id) >= 2;
Два креатива могут относиться к одному объявлению или к разным. В показанных связях каждая строка creatives участвует один раз, поэтому DISTINCT внутри COUNT не требуется. Фильтра по датам или типу объявления условие не задаёт.