Php 分页前的多维groupBy和orderBy-Laravel 5
我想做的是将用户写的评论与相同主题进行分组,并获取最新的评论。我尝试使用Comment::where->orderBy->groupBy,但它并没有像预期的那样返回数据 这是我的数据库:Php 分页前的多维groupBy和orderBy-Laravel 5,php,mysql,laravel,pagination,group-by,Php,Mysql,Laravel,Pagination,Group By,我想做的是将用户写的评论与相同主题进行分组,并获取最新的评论。我尝试使用Comment::where->orderBy->groupBy,但它并没有像预期的那样返回数据 这是我的数据库: | id | receiver_id | sender_id | title | body | created_at | | 13 | 2 | 5 | Art | DD | 12.30... | | 12 | 2 | 5 |
| id | receiver_id | sender_id | title | body | created_at |
| 13 | 2 | 5 | Art | DD | 12.30... |
| 12 | 2 | 5 | Art | CC | 12.20... |
| 11 | 2 | 5 | Art | BB | 12.10... |
| 10 | 2 | 5 | Art | AA | 12.00... |
| 9 | 2 | 3 | Msc | XX | 11.30... |
| 8 | 2 | 3 | Msc | YY | 11.20... |
| 7 | 2 | 3 | Msc | ZZ | 11.10... |
| 6 | 2 | 2 | Foo | UU | 10.40... |
| 5 | 2 | 2 | Foo | II | 10.30... |
| 4 | 2 | 2 | You | QQ | 10.20... |
| 3 | 2 | 2 | You | WW | 10.10... |
| 2 | 2 | 3 | Msc | LL | 10.00... |
| 1 | 2 | 4 | CSS | VV | 10.30... |
| 0 | 2 | 4 | CSS | NN | 10.20... |
我意识到,创建_at和id的顺序是相同的。所以,我决定使用id desc,因为在created_at字符串中安排日期整数可能会有问题。这就是我所尝试的:
$comment = Comment::where('receiver_id', Auth::user()->id)
->orderBy('id','desc')
->groupBy('sender_id', 'title')
->paginate(5);
dd($comment);
我想得到的结果是:
0=>注释{id=13,发送者id=5,title=Art,body=DD}最新创建时间
1=>注释{id=9,发送者_id=3,title=Msc,body=XX}
2=>注释{id=6,发送者\ id=2,title=Foo,body=UU}
3=>注释{id=4,发送者\ id=2,title=You,body=QQ}
4=>注释{id=1,发送者\ id=4,title=CSS,body=VV}
然而,这显示了如下情况:
0=>注释{id=10,发送者_id=5,标题=Art,正文=AA}
1=>注释{id=5,发送者_id=2,title=Foo,body=II}
2=>注释{id=3,发送者\ id=2,title=You,body=WW}
3=>注释{id=2,发送者_id=3,title=Msc,body=LL}
4=>注释{id=0,发送者_id=4,title=CSS,body=NN}
它给出了最新的评论,但得到了最早的评论
它完全跳过了User-3,并显示了User-2的2个主题
然后在这里显示User-3,在完成User2的2个主题之后,而不是在“Art”之后
当我在上述查询中删除->分页并尝试->toSql时,我收到:
"select * from `comments` where `receiver_id` = ? group by `title`, `sender_id` order by `id` desc"
我认为order by id desc零件是在错误的位置创建的,因此这可能会导致问题。但是,我不确定
另外,当我交换->orderBy和->groupBy的位置时,比如->groupBy,然后->orderBy,它返回完全相同的结果
最后,我尝试替换->orderBy'title',sender\u id',但结果还是一样
我做错了什么或错过了什么?提前感谢。您的问题是关于mysql group by在order by之前执行的 解决方案应具有内部联接:
Comment::join(\DB::raw('(select max(id) as id from comments group by sender_id) t'),function($join){
$join->on('comments.id', '=', 't.id');
})->where('comments.receiver_id', Auth::user()->id)
->orderBy('id','desc')
->paginate(5);
与此类似:
当我尝试您的示例时,由于某种原因,我收到了未找到的列:“on子句”中的1054未知列“t”。未找到列:1054子句“SQL:选择计数*作为来自注释的聚合”中的未知列“t”`Internal join select maxid from comments group by sender\u id t on comments.id=t where comments.receiver\u id=Test`。我理解你的方法,但我就是不知道如何应用它,因为这是一种给予error@senty,已修复,小姐身份声明谢谢!这使我向前迈出了一大步。它成功地将用户组合在一起。但是,我想有一个条目,其中发送者id和主题都是相同的。所以,我想为ids6&5和3&4提供两个单独的元素,因为它们有不同的主题