复杂的 OrderBy 使用多列

Posted

技术标签:

【中文标题】复杂的 OrderBy 使用多列【英文标题】:Complex OrderBy using multiple columns 【发布时间】:2019-07-07 06:56:21 【问题描述】:

我有一个足球赛事表,它显示基于minuteextra_minute 的赛事。例如:

 id |    type    | minute | extra_minute  |  reason
 1  | yellowcard |   45   | null          |   null
 2  | yellowcard |   45   |  1            |   null
 3  |   period   |   45   | null          |    HT
 4  |    goal    |   45   |  2            |   null
 5  |    goal    |   46   |  2            |   null    // this is second half
 6  |   period   |   90   | null          |    FT
 7  |    goal    |   90   |  2            |   null

顺序应该是

yellowcard (45)
yellowcard (45+1)
   goal    (45+2)
    HT
   goal    (46)
   goal    (90+2)
    FT

我在 Match 中尝试了一个关系查询,例如

public function events() 
    return $this->hasMany(Event::class)->orderBy('minute', 'asc')
                                       ->orderBy('extra_minute', 'asc');

但这会导致

    HT
yellowcard (45)
yellowcard (45+1)
   goal    (45+2)
   ...

使用 Laravel Query Builder 对所需样式进行排序的方式是什么? 我知道为什么我的查询生成器不工作,但我无法想出一些东西来实现我想要的

【问题讨论】:

【参考方案1】:

->orderByRaw('type = ? asc', 'period') 是这样做的方法。

return $this->hasMany(Event::class)
            ->orderBy('minute', 'asc')
            ->orderByRaw('type = ? asc', 'period')
            ->orderBy('et_minute', 'asc');

【讨论】:

以上是关于复杂的 OrderBy 使用多列的主要内容,如果未能解决你的问题,请参考以下文章

Pyspark orderBy 在对多列进行排序时给出不正确的结果

使用 Doctrine 按多列排序

LINQ OrderBy().ThenBy() 不工作

如何在 GROUP BY 和 ORDER BY 中使用多列但只有一列

MySQL order by关键字详解,order by排序

下)