> Как исправить SQL запрос, который собирает строку без контекста? (Go)

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

Компании: InDrive

Стек: Go

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

Проблема "сбор строки без контекста" обычно возникает, когда вы используете агрегатную функцию (например, GROUP_CONCAT в MySQL, string_agg в PostgreSQL) без чёткого указания порядка сортировки или без группировки по нужным полям. Это приводит к тому, что строки склеиваются в произвольном порядке, а данные теряют смысл.

Как исправить:

  1. Добавьте ORDER BY внутри агрегатной функции, чтобы гарантировать порядок элементов в результирующей строке. Например, в PostgreSQL:

    SQL
    SELECT user_id, string_agg(product_name, ', ' ORDER BY purchase_date DESC) AS products
    FROM purchases
    GROUP BY user_id;
  2. Убедитесь, что GROUP BY включает все неагрегированные столбцы, иначе запрос может вернуть неверные или дублирующиеся строки.

  3. Если контекст теряется из-за отсутствия фильтрации, добавьте WHERE или HAVING, чтобы ограничить набор данных, например, только за последний месяц.

  4. В Go при построении запроса динамически используйте параметризованные запросы (например, через database/sql с плейсхолдерами $1, $2), чтобы избежать SQL-инъекций и сохранить читаемость.

Пример исправленного запроса для Go с PostgreSQL:

GO
rows, err := db.Query(`
SELECT user_id, string_agg(product_name, ', ' ORDER BY purchase_date DESC) AS products
FROM purchases
WHERE purchase_date > $1
GROUP BY user_id
`, time.Now().AddDate(0, -1, 0))

Это гарантирует, что строка собирается в осмысленном порядке и с правильным контекстом (например, последние покупки).

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

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