如何在查询构建器 laravel 上从每个组中获取多个数据

Posted

技术标签:

【中文标题】如何在查询构建器 laravel 上从每个组中获取多个数据【英文标题】:How to get the several data from each group on query builder laravel 【发布时间】:2018-09-11 12:48:29 【问题描述】:

a16s 表

id  p_id u_id   time
1   1       2   0
2   1       1   1
3   1       5   2
4   1       6   3
5   1       7   4
6   2       2   2
7   2       3   1
8   2       1   0
9   3       2   11
10  3       4   8
11  3       8   15

我想得到 每组的前两个数据按时间排序

p_id u_id time
1     2   0
1     1   1
2     1   0
2     3   1
3     4   8
3     2   11

我试试查询

  $result = DB::table('a16s')

            ->select ('p_id','u_id','time'))
            ->orderBy('time', 'desc')
            ->groupBy('p_id')
            ->get();

    echo '<pre>' ;
    print_r($result);

我得到了错误 SQLSTATE[42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #2 不在 GROUP BY 子句中,并且包含非聚合列...

我可以使用两次 groupby 吗?我想让这个结果在 jquery 数据表上使用。

来自数据库

id  p_id    u_id    approve time
1   1          1    1       1
2   1          2    1       2
3   1          3    1       3
4   1          4    0       4
5   1          5    0       5
6   2          1    0       1
7   2          2    1       2
8   2          5    0       3
9   2          6    0       4
10  3          2    1       1
11  3          5    1       2
12  3          8    1       3

获取表格

【问题讨论】:

试试这个链接***.com/questions/49229955/… 【参考方案1】:

试试这个

$result = DB::table('a16s')
            ->select('p_id', 'u_id', 'time')
            ->orderBy('time', 'desc')
            ->get()
            ->groupBy('p_id')
            ->map(function ($deal) 
                return $deal->take(2);
            );

【讨论】:

感谢您的帮助!我可以将一列添加到两次分组吗?我在上面修改了我的问题。我尝试 ->get()->groupBy('p_id')->group('approve')->.... 但不行。 如果你想对多列进行分组,你可以 ->groupBy('p_id' , '2nd Column') 我试过 groupBy('p_id','approve') 但我只得到了 group1 的前两行,就像:group1(p_id=1) -group2(approve-1)-u_id1 和 u_id( 2row) , 没有得到 group1(p_id=1)-group2(approve-0)-u_id4 和 u_id5 (2rows) ?我在哪里可以解决问题?【参考方案2】:

对于您的 SQL 版本,u_id 需要被排除在选择之外或添加到 GROUP BY 子句中。

请参阅此mysql doc 了解更多信息。

【讨论】:

【参考方案3】:

使用this trick:

$join = DB::table('a16s')->select('p_id')
    ->selectRaw('GROUP_CONCAT(time ORDER BY time ASC) times')->groupBy('p_id');
$sql = '(' . $join->toSql() . ') latest';
$result = DB::table('a16s')
    ->select('a16s.*')
    ->join(DB::raw($sql), function($join) 
        $join->on('a16s.p_id','=','latest.p_id');
        $join->whereBetween(DB::raw('FIND_IN_SET(`a16s`.`time`, `latest`.`times`)'), [1, 2]);
    )
    ->get();

【讨论】:

以上是关于如何在查询构建器 laravel 上从每个组中获取多个数据的主要内容,如果未能解决你的问题,请参考以下文章

Laravel,如何将集合对象转换为构建器对象

如何从两个不同的 Laravel 查询构建器中获取我的两个结果集以同时显示在同一页面上?

如何使用 Laravel 的查询构建器执行嵌套连接?

Laravel:使用模型查询构建器获取重复记录的结果

如何在 laravel 查询生成器上获取主键名称

在 Laravel get() 查询构建器中附加两个数组