如何从查询构建器laravel

时间:2018-04-02 09:49:09

标签: laravel query-builder laravel-query-builder

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

拿到桌子 enter image description here

3 个答案:

答案 0 :(得分:2)

试试这个

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

答案 1 :(得分:1)

使用您的SQL版本时,u_id将需要不在select中或添加到GROUP BY子句中。

有关详细信息,请参阅此MySql doc

答案 2 :(得分:0)

使用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();