首页 > 解决方案 > 选择最新的 N 项按从旧到新排序

问题描述

我正在尝试使用以下实体按创建日期选择最新消息。

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 条消息。问题是我需要在那之后颠倒顺序。

我们如何按升序对结果重新排序?(最后一条信息应该在最后)

标签: gogo-gorm

解决方案


这就是我想出的:

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

推荐阅读