如何在查询构建器 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 上从每个组中获取多个数据的主要内容,如果未能解决你的问题,请参考以下文章