Напишите SQL запрос для подсчета адресов с более чем пятью проживающими
Что проверяют
Сначала точность чтения условия: просят число адресов или их список. Дальше умение построить агрегат поверх агрегата и аккуратно вытащить одно значение из базы средствами database/sql.
Как отвечать
Уточните формулировку вслух, а потом покажите оба варианта. Список адресов:
select address_id, count(*) as residents
from residents
group by address_id
having count(*) > 5;Если нужно именно количество таких адресов, группировка заворачивается в подзапрос:
select count(*) from (
select address_id
from residents
group by address_id
having count(*) > 5
) t;Внешний count считает строки результата, то есть адреса, а не жильцов: разница между этими двумя числами и есть проверяемое место. В Go запрос читается одной строкой, с контекстом и плейсхолдером вместо склейки:
var n int
err := db.QueryRowContext(ctx, q, minResidents).Scan(&n)Скажите заодно, что группировать надо по идентификатору адреса, а не по текстовому полю: одинаковые адреса с разным написанием разъедутся по разным группам.
Где спотыкаются
Отвечают списком на вопрос про число или наоборот, не уточнив требование. Это не про SQL, но засчитывается как невнимательность к постановке задачи, а она в работе стоит дороже синтаксиса.
Второе: пробуют написать count(count(*)) или поставить агрегат в WHERE. Вложенная агрегация без подзапроса невозможна, и это распространённая точка ступора.
Третье: в Go подставляют порог прямо в текст запроса через fmt.Sprintf. Для числа это ещё не инъекция, но привычка ровно та, из-за которой строковые параметры однажды уезжают в запрос без экранирования. Плюс забывают про rows.Err() и defer rows.Close(), когда читают выборку, а не одно значение.