【问题标题】:Laravel Datatables Getting First Row of the queryLaravel 数据表获取查询的第一行
【发布时间】:2025-11-29 05:50:01
【问题描述】:

我正在使用 yajra 的 laravel/datatables 插件,我只想发送根据记录降序排序的查询中每个组的第一行。这是我的查询:

$qsrecords = QualityScore::where('clientID', '=', $user['id'])
       ->whereBetween('day', array($startDate, $endDate))
       ->where($desiredValue, $operator, $quantity)
       ->where('previousQualityScore','!=','0');

此查询返回此给定用户 ID 的每条记录,例如:

Client ID | Keyword ID | Quality Score |     Date
   2           81            8            21.08.2016
   2           42            9            19.08.2016
   2           81            7            16.08.2016
   2           42            5            14.08.2016

如您所见,我有 2 个不同的关键字,我的查询给出了该输出。

但我希望我的查询生成如下结果:

Client ID | Keyword ID | Quality Score |     Date
   2           81            8            21.08.2016
   2           42            9            19.08.2016

只有每个关键字的最后一条记录。这是我想要实现的。

我发送查询以查看的方式:

    // Send data to view via datatables plugin
    return Datatables::of($qsrecords)->make(true);

【问题讨论】:

    标签: laravel datatables laravel-5.2


    【解决方案1】:

    试试这个

    QualityScore::select( * , DB::raw('MAX(date) as date'))
                  ->where('clientID', '=', $user['id'])
                 ->whereBetween('day', array($startDate, $endDate))
                 ->where($desiredValue, $operator, $quantity)
                 ->where('previousQualityScore','!=','0');
                 ->groupBy('keyword_id')
                   ->get();
    

    【讨论】:

    • 嘿,谢谢你的回复。当我使用您的查询时,laravel 给出 parseError: syntax error, unexpected '*' 。我应该说,因为我使用的是数据表插件,所以我无法在查询末尾写一个“->get()”。
    • 我已经编辑了我的问题,以向您展示我将此查询发送到数据表插件以创建视图的方式。
    • 对那个 parseError 很抱歉:语法错误。我应该尝试一下 select (*) 。干杯你想通了。
    • 实际上,我现在面临另一个问题。 max(day) 给了我最新记录的一天,但该行的其他字段,如 qualityscore、以前的 qualityscore 不是今天的信息......
    • 我也试过(*),它给出了和上面例子一样的错误
    【解决方案2】:

    我终于明白了!我已经改变了处理这个问题的方式,但是下面的代码已经解决了这个问题,感谢@Kiran-sadvilkar 的建议。

    $groupByMaxDateQuery = ' SELECT qs.adGroup,qs.keyword, qs.previousQualityScore, qs.qualityScore, qs.qualityScoreDifference, qs.day 
                    FROM homestead.qualityScore AS qs
                    INNER JOIN (
                        SELECT adGroupID, keywordID, max(day) 
                        AS MaxDay 
                        FROM homestead.qualityScore 
                        GROUP BY adGroupID,keywordID
                    )
                    innerTable ON qs.adGroupID = innerTable.adGroupID 
                        AND qs.keywordID = innerTable.keywordID 
                        AND qs.day = innerTable.MaxDay
                    WHERE qs.clientID = '.$user['id'].' AND 
                        qs.day BETWEEN "'.$startDate.'" AND "'.$endDate.'" AND 
                        qs.'.$desiredValue.' '.$operator.' '.$quantity.' AND 
                        qs.previousQualityScore != 0
                    ';
    
        // Pull data from database with current conditions
        $qsrecords = DB::table(DB::raw("($groupByMaxDateQuery) as qs"));
    

    因此,我决定使用原始 sql 查询,现在它可以工作了...

    【讨论】: