typeUserStatstruct{UserIDint64`gorm:"column:user_id"`Usernamestring`gorm:"column:username"`TotalAmountfloat64`gorm:"column:total_amount"`AvgAmountfloat64`gorm:"column:avg_amount"`}varstats[]UserStaterr:=db.Table("users").Select("users.id as user_id, users.username, COALESCE(SUM(orders.amount), 0) as total_amount, COALESCE(AVG(orders.amount), 0) as avg_amount").Joins("LEFT JOIN orders ON orders.user_id = users.id AND orders.created_at >= ?",thirtyDaysAgo).Where("users.tenant_id = ? AND users.status = ?",tenantID,"active").Group("users.id, users.username").Having("SUM(orders.amount) > ?",minTotalAmount).Order("total_amount DESC").Limit(10).Scan(&stats).Error
GORM 原生 SQL (db.Raw)
err:=db.Raw(`
SELECT
u.id AS user_id,
u.username,
COALESCE(SUM(o.amount), 0) AS total_amount,
COALESCE(AVG(o.amount), 0) AS avg_amount
FROM users u
LEFT JOIN orders o ON o.user_id = u.id AND o.created_at >= ?
WHERE u.tenant_id = ? AND u.status = ?
GROUP BY u.id, u.username
HAVING SUM(o.amount) > ?
ORDER BY total_amount DESC
LIMIT 10
`,thirtyDaysAgo,tenantID,"active",minTotalAmount).Scan(&stats).Error
// Code generated by sqlc. DO NOT EDIT.packagedbimport("context""encoding/json""github.com/google/uuid"pgvector"github.com/pgvector/pgvector-go")constsearchDocumentChunks=`-- name: SearchDocumentChunks :many
SELECT
c.id AS chunk_id,
c.document_id,
d.title AS document_title,
c.content,
c.metadata,
1 - (c.embedding <=> sqlc.arg('embedding')) AS similarity_score
FROM document_chunks c
INNER JOIN documents d ON d.id = c.document_id
WHERE c.tenant_id = sqlc.arg('tenant_id')
AND d.status = 'published'
AND (1 - (c.embedding <=> sqlc.arg('embedding'))) >= sqlc.arg('min_similarity')
ORDER BY similarity_score DESC
LIMIT sqlc.arg('result_limit')
`typeSearchDocumentChunksParamsstruct{Embeddingpgvector.Vector`json:"embedding"`TenantIDstring`json:"tenant_id"`MinSimilarityfloat64`json:"min_similarity"`ResultLimitint32`json:"result_limit"`}typeSearchDocumentChunksRowstruct{ChunkIDuuid.UUID`json:"chunk_id"`DocumentIDuuid.UUID`json:"document_id"`DocumentTitlestring`json:"document_title"`Contentstring`json:"content"`Metadatajson.RawMessage`json:"metadata"`SimilarityScorefloat64`json:"similarity_score"`}func(q*Queries)SearchDocumentChunks(ctxcontext.Context,argSearchDocumentChunksParams)([]SearchDocumentChunksRow,error){rows,err:=q.db.Query(ctx,searchDocumentChunks,arg.Embedding,arg.TenantID,arg.MinSimilarity,arg.ResultLimit,)iferr!=nil{returnnil,err}deferrows.Close()varitems[]SearchDocumentChunksRowforrows.Next(){variSearchDocumentChunksRowiferr:=rows.Scan(&i.ChunkID,&i.DocumentID,&i.DocumentTitle,&i.Content,&i.Metadata,&i.SimilarityScore,);err!=nil{returnnil,err}items=append(items,i)}iferr:=rows.Err();err!=nil{returnnil,err}returnitems,nil}