【问题标题】:laravel elequent builder join with paginatelaravel eloquent builder 加入分页
【发布时间】:2021-07-01 15:47:50
【问题描述】:

我有这个查询从基于DISTINCT destination_tbls.destination 的两个表中返回数据 像下面这样:

SELECT DISTINCT
   destination_tbls.destination,
   MIN(sms_details.id),
   MIN(sms_details.msg_timestamp) AS TIMESTAMP,
   MIN(destination_tbls.count) 
FROM
   sms_details 
   JOIN
      (
         SELECT
            * 
         FROM
            destination_tbls
      )
      destination_tbls 
      ON destination_tbls.id = sms_details.destination_tbls_id 
GROUP BY
   destination_tbls.destination;

现在如何使用它们的分页, 我尝试了类似的方法,但不起作用:

DB::select('
SELECT DISTINCT destination_tbls.destination,MIN(sms_details.id),MIN(sms_details.msg_timestamp) AS TIMESTAMP,MIN(destination_tbls.count)
FROM sms_details
JOIN(SELECT * FROM destination_tbls) destination_tbls ON destination_tbls.id=sms_details.destination_tbls_id
GROUP BY destination_tbls.destination
')->simplePaginate(100);

任何帮助将不胜感激!

【问题讨论】:

    标签: php database laravel eloquent


    【解决方案1】:

    如果你想使用 laravel 的分页,你需要使用查询构建器方法编写查询。

    $results = DB::table('sms_details')
        ->select('destination_tbls.destination')
        ->selectRaw('min(sms_details.id)')
        ->selectRaw('min(sms_details.msg_timestamp) as timestamp')
        ->selectRaw('min(destination_tbls.count)')
        ->distinct()
        ->joinSub(
            function ($sub) {
                $sub->from('destination_tbls');
            },
            'destination_tbls',
            function ($join) {
                $join->on('destination_tbls.id', '=', 'sms_details.destination_tbls_id');
            }
        )
        ->groupBy('destination_tbls.destination')
        ->simplePaginate(100);
    

    由于您实际上并没有在子查询连接中做任何事情,因此您可以改为连接表。

    $query = DB::table('sms_details')
        ->select('destination_tbls.destination')
        ->selectRaw('min(sms_details.id)')
        ->selectRaw('min(sms_details.msg_timestamp) as timestamp')
        ->selectRaw('min(destination_tbls.count)')
        ->distinct()
        ->join('destination_tbls', 'destination_tbls.id', '=', 'sms_details.destination_tbls_id')
        ->groupBy('destination_tbls.destination')
        ->simplePaginate(100);
    

    【讨论】:

    • 亲爱的 IGP 我有计数问题,它需要很多时间超过 6 分钟。我怎样才能增加它们?我的代码是这样的DB::table('sms_details') ->select('sms_details.id', 'destination_tbls.destination','sms_source_cats.source_catigury as senderid', 'sms_details.msg_timestamp AS timestamp', 'destination_tbls.count') ->join('destination_tbls', 'destination_tbls.id', '=', 'sms_details.destination_tbls_id') ->join('sms_source_cats', 'sms_source_cats.id', '=', 'sms_details.sms_sources_id') ->whereRaw($settings['whereFilters'])->count();
    • 请注意,我的数据库有 80000000 行,我使用了密钥和分区。
    猜你喜欢
    • 2020-04-26
    • 2014-04-17
    • 2022-01-20
    • 2018-08-16
    • 2022-01-13
    • 2015-06-15
    • 2020-10-30
    • 2015-07-17
    • 2015-06-06
    相关资源
    最近更新 更多