Ответ
INNER JOIN — это операция в SQL, которая объединяет строки из двух или более таблиц и возвращает только те из них, для которых выполняется условие объединения. Иными словами, в результат попадают только записи, имеющие совпадающие значения в обеих таблицах.
В Go INNER JOIN
используется двумя основными способами:
1. Через Raw SQL с пакетом database/sql
Это фундаментальный способ, который работает с любой реляционной базой данных.
// Пример: получить заказы, у которых есть существующий пользователь
rows, err := db.Query(`
SELECT o.id, o.amount, u.name
FROM orders AS o
INNER JOIN users AS u ON o.user_id = u.id
`)
if err != nil {
// обработка ошибки
}
defer rows.Close()
// ... и далее итерация по результатам
2. С помощью ORM (например, GORM)
ORM абстрагирует SQL-запросы, позволяя работать с объектами Go.
// Модели с определенной связью
type User struct {
ID uint
Name string
}
type Order struct {
ID uint
UserID uint
Amount float64
User User `gorm:"foreignKey:UserID"`
}
// Запрос с автоматическим INNER JOIN
var orders []Order
// GORM на основе тега foreignKey сгенерирует INNER JOIN
db.Joins("User").Find(&orders)
// Сгенерированный SQL будет примерно таким:
// SELECT * FROM "orders" INNER JOIN "users" ON "users"."id" = "orders"."user_id"
Ключевая идея: INNER JOIN
используется, когда нужно получить набор данных, где каждая запись гарантированно имеет связанные данные в другой таблице (например, «все заказы, у которых есть покупатель»).