> Какие джойны и группировки используются для подсчета количества людей по адресам (Go)

Уровень: middle · Роль: backend · Язык: Go · Категория: Технические вопросы

Компании: Wildberries

Стек: Go

> Пример ответа

Для подсчёта количества людей по адресам обычно используется комбинация LEFT JOIN и GROUP BY с агрегатной функцией COUNT. Основная идея: таблица адресов (например, addresses) соединяется с таблицей людей (например, people) через внешний ключ address_id, после чего данные группируются по адресу.

Пример SQL-запроса:

SQL
SELECT a.id, a.full_address, COUNT(p.id) AS people_count
FROM addresses a
LEFT JOIN people p ON a.id = p.address_id
GROUP BY a.id, a.full_address;
  • LEFT JOIN гарантирует, что адреса без жильцов тоже попадут в результат (с нулевым количеством). Если нужны только адреса с хотя бы одним человеком, используйте INNER JOIN.
  • GROUP BY по полям адреса (обычно по id, чтобы избежать дублирования при неполной нормализации).
  • COUNT(p.id) считает количество записей в таблице people для каждого адреса. Если в people есть NULL (при LEFT JOIN), они не учитываются.

В Go с использованием database/sql это выглядит так:

GO
type AddressCount struct {
ID int
Address string
Count int
}
rows, err := db.Query(`
SELECT a.id, a.full_address, COUNT(p.id)
FROM addresses a
LEFT JOIN people p ON a.id = p.address_id
GROUP BY a.id, a.full_address
`)
if err != nil {
// обработка ошибки
}
defer rows.Close()
var results []AddressCount
for rows.Next() {
var ac AddressCount
if err := rows.Scan(&ac.ID, &ac.Address, &ac.Count); err != nil {
// обработка ошибки
}
results = append(results, ac)
}

Такой подход эффективен, если индексы на address_id в таблице people и на id в addresses созданы. Для больших объёмов данных можно добавить WHERE-фильтры или использовать материализованные представления.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью