字节笔记本字节笔记本

Golang gorm order 排序问题

2021-10-18

在Golang的gorm库中,使用`Order`和`Limit`方法正确排序和获取第一个创建的User,避免使用`First`和`Last`方法,因为它们会自动添加主键排序。

如查询”按照created_at升序第一个创建的User“

正确的写法:

db.Model(&models.User{}).Order("created_at ASC").Limit(1).Find(&s)

sql:

SELECT * FROM "users" ORDER BY created_at ASC LIMIT 1

错误写法:

db.Model(&models.User{}).Order("created_at ASC").First(&s)

这样写会自动加上主键的排序,生成的sql,虽然说结果应该都没什么差别,但是和预期的sql并不一样:

SELECT * FROM "users" ORDER BY created_at ASC, "users"."id" ASC LIMIT 1

错误写法:

这样写,直接和想要的sql意图相反,变成”最后一个创建的User“,且自动加上了主键的排序

db.Model(&models.User{}).Order("created_at DESC").Last(&s)

sql:

SELECT * FROM "users" ORDER BY created_at DESC, "users"."id" DESC LIMIT 1