Select 最新的 N 项从旧到新排序
Select the latest N items sorted in oldest to newer
我正在尝试 select 与以下实体的创建日期的最新消息。
type Message struct {
ID uuid.UUID `gorm:"primaryKey;type:uuid;not null" json:"id"`
CreatedAt time.Time `json:"createdAt"`
Content string `json:"content"`
Room *Room `json:"room,omitempty"`
RoomID uuid.UUID `gorm:"type:uuid;not null" json:"-"`
User *User `json:"author,omitempty"`
UserID uuid.UUID `gorm:"type:uuid;not null" json:"-"`
}
我提出了以下查询:
var messages []entity.Message
// get latest 10 items
// newest by date will be at the top
if err := r.db.
Where(&entity.Message{RoomID: room.ID}).
Order("created_at DESC").
Limit(10).
Preload("User").
Find(&messages).Error; err != nil {
return nil, err
}
我们按创建日期降序检索最新的 10 条消息。问题是之后我需要倒序。
我们怎样才能按升序对结果重新排序? (最后一条消息应该在最后)
这是我想出的:
if err := r.db.
Debug().
Table("(?) as m", r.db.Model(&entity.Message{}).Where(&entity.Message{RoomID: room.ID}).Order("created_at DESC").Limit(20)).
Order("created_at ASC").
Preload("User").
Find(&messages).Error; err != nil {
return nil, err
}
生产:
SELECT * FROM (SELECT * FROM "messages" WHERE "messages"."room_id" = '1cf10408-f2b5-4607-8b86-4c0a16ae1fe3' ORDER BY created_at DESC LIMIT 20) as m ORDER BY created_at ASC
使用子查询很好,但是在检索切片后简单地反转切片又如何呢?
for i, j := 0, len(messages)-1; i < j; i++, j--) {
messages[i], messages[j] = messages[j], messages[i]
}
我正在尝试 select 与以下实体的创建日期的最新消息。
type Message struct {
ID uuid.UUID `gorm:"primaryKey;type:uuid;not null" json:"id"`
CreatedAt time.Time `json:"createdAt"`
Content string `json:"content"`
Room *Room `json:"room,omitempty"`
RoomID uuid.UUID `gorm:"type:uuid;not null" json:"-"`
User *User `json:"author,omitempty"`
UserID uuid.UUID `gorm:"type:uuid;not null" json:"-"`
}
我提出了以下查询:
var messages []entity.Message
// get latest 10 items
// newest by date will be at the top
if err := r.db.
Where(&entity.Message{RoomID: room.ID}).
Order("created_at DESC").
Limit(10).
Preload("User").
Find(&messages).Error; err != nil {
return nil, err
}
我们按创建日期降序检索最新的 10 条消息。问题是之后我需要倒序。
我们怎样才能按升序对结果重新排序? (最后一条消息应该在最后)
这是我想出的:
if err := r.db.
Debug().
Table("(?) as m", r.db.Model(&entity.Message{}).Where(&entity.Message{RoomID: room.ID}).Order("created_at DESC").Limit(20)).
Order("created_at ASC").
Preload("User").
Find(&messages).Error; err != nil {
return nil, err
}
生产:
SELECT * FROM (SELECT * FROM "messages" WHERE "messages"."room_id" = '1cf10408-f2b5-4607-8b86-4c0a16ae1fe3' ORDER BY created_at DESC LIMIT 20) as m ORDER BY created_at ASC
使用子查询很好,但是在检索切片后简单地反转切片又如何呢?
for i, j := 0, len(messages)-1; i < j; i++, j--) {
messages[i], messages[j] = messages[j], messages[i]
}