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]
}