Laravel 查询生成器 order by 不适用于左连接

Posted

技术标签:

【中文标题】Laravel 查询生成器 order by 不适用于左连接【英文标题】:Laravel query builder order by doesn't work with left join 【发布时间】:2016-11-12 19:27:12 【问题描述】:

为什么 orderBy 不起作用,它不是按 nbr_votes 降序排序?

$all_players = DB::table('example_players')->leftJoin('example_votes', 'example_votes.from_player_id', '=', 'example_players.id')
                                           ->select('example_players.id', 'example_players.name', 'example_players.display_name', 'example_players.role', 'example_players.picture', DB::raw("sum(case example_votes.vote when 'like' then 1 else 0 end) as nbr_votes"))
                                           ->orderBy('nbr_votes', 'desc')                                          
                                           ->groupBy('example_players.id')                                         
                                           ->get();

编辑问题已解决 我将 from_player_id 列与另一列混淆了。谢谢大家的帮助:)

【问题讨论】:

【参考方案1】:

我认为您应该在订购结果之前进行分组。

$all_players = DB::table('example_players')->leftJoin('example_votes', 'example_votes.from_player_id', '=', 'example_players.id')
                                            ->select('example_players.id', 'example_players.name', 'example_players.display_name', 'example_players.role', 'example_players.picture', DB::raw("count(example_votes.id) as nbr_votes"))
                                            ->groupBy('example_players.id') 
                                            ->orderBy('nbr_votes', 'desc')                                                                
                                            ->get();

【讨论】:

您好,谢谢您的回答。但是我已经尝试过了,它并没有改变什么。【参考方案2】:
$all_players = DB::table('example_players')->leftJoin('example_votes', 'example_votes.from_player_id', '=', 'example_players.id')
                                           ->select('example_players.id', 'example_players.name', 'example_players.display_name', 'example_players.role', 'example_players.picture', DB::raw("count(example_votes.id) as nbr_votes"))
                                           ->groupBy('example_players.id')                                         
                                           ->orderBy(DB::raw("count(examples_votes.id)"),'desc')                                          
                                           ->get();

这是因为 orderby 不知道你用 as 给该字段的名称。

【讨论】:

->orderBy(DB::raw("count(overwatch_votes.id)"), 'desc') 改变顺序,但不改变 overwatch_votes.id desc 那是因为我在您的查询中没有看到 overwatch_votes 表?您应该首先加入该表以在其上订购。 谢谢你,但我想按数量来订购examples_voted.id desc

以上是关于Laravel 查询生成器 order by 不适用于左连接的主要内容,如果未能解决你的问题,请参考以下文章

laravel eloquent order by specific value with PostgreSQL 数据库

HSQLDB - 可更新语句不适用于“SELECT TOP”或“ORDER BY”

MySQL调优--05---多表查询优化子查询优化 ORDER BY优化GROUP BY优化分页查询优化

laravel order by

Laravel 分页不适用于 group by 子句

Laravel eloquent order by custom 属性