当前位置: 首页 > 知识库问答 >
问题:

如何在query builder laravel上从每个组中获取多个数据

毋炳
2023-03-14

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

我想从每个组中按时间获取前两个数据orderby

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]:语法错误或访问冲突:SELECT list的1055表达式#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

共有3个答案

申黎明
2023-03-14

使用这个技巧:

$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();
谯嘉懿
2023-03-14

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

有关更多信息,请参阅此MySql文档。

逄兴昌
2023-03-14

试试这个

$result = DB::table('a16s')
            ->select('p_id', 'u_id', 'time')
            ->orderBy('time', 'desc')
            ->get()
            ->groupBy('p_id')
            ->map(function ($deal) {
                return $deal->take(2);
            });
 类似资料:
  • 问题内容: 例 问题,如何获得单一值,例如: 问题答案: 查看您的中的键和缩进: …等等

  • 问题内容: 我正在使用Javascript(ES6)/ FaceBook进行反应,并尝试获取大小变化的数组的前3个元素。我想做相当于Linq take(n)。 在我的Jsx文件中,我有以下内容: 然后得到我尝试的前三个项目 这不起作用,因为地图没有设置功能。 你能帮忙吗? 问题答案: 我相信您正在寻找的是:

  • 问题内容: 我想获得表中每个记录的最小日期,该记录具有一个主键的多个日期条目。看看我的桌子: 我想要这样的结果: 我想获取每个CaseNo的最短日期记录在我的桌子上。 我尝试了这段代码: 结果是这样的: 该代码删除没有最小日期的行。我想显示所有记录的最小日期为Min_date。 问题答案: 试试这个

  • 所以我有一个帖子集。在“post”集合中,我有另一个名为“likes”的集合。 所以我想同时从每个文档中获取每个集合,并在之后映射它们。有没有办法做到这一点? 因为在Firebase中,您只能从一个文档中获取集合,但我想从每个文档中获取每个集合。

  • 基本上我有一个数组如下所示: 用什么方法来计算重复次数最多的动作以及它重复了多少次?关键字“when”无关紧要。