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
答案 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();