> Какие джойны и группировки используются для подсчета количества людей по адресам (Go)
Уровень: middle · Роль: backend · Язык: Go · Категория: Технические вопросы
Компании: Wildberries
Стек: Go
> Пример ответа
Для подсчёта количества людей по адресам обычно используется комбинация LEFT JOIN и GROUP BY с агрегатной функцией COUNT. Основная идея: таблица адресов (например, addresses) соединяется с таблицей людей (например, people) через внешний ключ address_id, после чего данные группируются по адресу.
Пример SQL-запроса:
SQLSELECT a.id, a.full_address, COUNT(p.id) AS people_countFROM addresses aLEFT JOIN people p ON a.id = p.address_idGROUP BY a.id, a.full_address;
- LEFT JOIN гарантирует, что адреса без жильцов тоже попадут в результат (с нулевым количеством). Если нужны только адреса с хотя бы одним человеком, используйте
INNER JOIN. - GROUP BY по полям адреса (обычно по
id, чтобы избежать дублирования при неполной нормализации). - COUNT(p.id) считает количество записей в таблице
peopleдля каждого адреса. Если вpeopleестьNULL(приLEFT JOIN), они не учитываются.
В Go с использованием database/sql это выглядит так:
GOtype AddressCount struct {ID intAddress stringCount int}rows, err := db.Query(`SELECT a.id, a.full_address, COUNT(p.id)FROM addresses aLEFT JOIN people p ON a.id = p.address_idGROUP BY a.id, a.full_address`)if err != nil {// обработка ошибки}defer rows.Close()var results []AddressCountfor rows.Next() {var ac AddressCountif err := rows.Scan(&ac.ID, &ac.Address, &ac.Count); err != nil {// обработка ошибки}results = append(results, ac)}
Такой подход эффективен, если индексы на address_id в таблице people и на id в addresses созданы. Для больших объёмов данных можно добавить WHERE-фильтры или использовать материализованные представления.
> Похожие задачи по Go
Используете ли вы пакет sync.Pool для контроля памяти в Go
Используете ли вы воркерпул для ограничения количества горутин в Go
Как разделить большую таблицу по студентам для оптимизации запросов
Как масштабировать Kafka при высокой нагрузке
> Похожие задачи по backend
Используете ли вы пакет sync.Pool для контроля памяти в Go
Используете ли вы воркерпул для ограничения количества горутин в Go
Как разделить большую таблицу по студентам для оптимизации запросов
Как масштабировать Kafka при высокой нагрузке
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью