【问题标题】:Laravel union few tables and sort the result by a columnLaravel 联合几个表并按列对结果进行排序
【发布时间】:2021-02-06 21:15:42
【问题描述】:

我有 4 个单独的选择查询,每个查询都生成一个具有相同列的表,例如 id 和 created_at。 然后我想联合,按 created_at 排序并获取每个 ID 的最新 created_at。所以我还需要使用 group by。

文档中的示例结果为(select ..) union (select ...),但我不知道该怎么做

DB::select(DB::raw(id, MAX(created_at))
->from($query1->union($query2)->union($query3)->union($query4)))
->groupBy('id')
->orderBy('created_at');

或者类似的东西。

【问题讨论】:

    标签: php mysql laravel eloquent


    【解决方案1】:

    这应该适合你:)

    $query1 = DB::table('table1')->where(....);
    $query2 = DB::table('table2')->where(....);
    $query3 = DB::table('table3')->where(....);
    $query4 = DB::table('table4')->where(....);
    $query5 = DB::table('table5')->where(....);
    
    $data = DB::select(DB::raw('id, MAX(created_at) as max_created_at')
              ->union($query1)->union($query2)->union($query3)->union($query4)->union($query5)
              ->orderBy('max_created_at')
              ->groupBy('id')
              ->get();
    

    如果您遇到任何问题,请告诉我:)

    【讨论】:

    • 它会导致不同的查询。我想“select * from (unions...) group by id”我得到 (select * from table group by id) union (...)
    • @Victor 现在检查?编辑了我的答案
    • 似乎 $data 缺少一个 ),当我把它放在所有联合之后,我会得到未定义的联合方法错误!
    【解决方案2】:

    您可以使用 fromSub() 方法将联合查询添加为子查询,并对结果执行 groupBy 和其他聚合

    $union_query = $query1->union($query2)->union($query3);
    $results = DB::query()
                    ->fromSub($union_query, 'union_query')
                    ->select('id', DB::raw('MAX(created_at) as most_recent'))
                    ->groupBy('id')
                    ->orderBy('most_recent', 'desc')
                    ->get();
    

    参考:PatBriPerso in this laracasts discussion的回答

    【讨论】:

      【解决方案3】:

      您可以执行以下操作:

      • 将所有查询合并到一个集合中

      $result = $query1->merge($query2)->merge($query3)->merge($query4);

      • 将您需要的方法添加到集合中

      $filtered = $collection->groupBy('id')->sortBy('created_at');

      【讨论】:

      • 如果数据库中有很多行,就会出现内存问题。就像想象有 100k 行,我将创建 100k 个项目的集合
      猜你喜欢
      • 2013-09-08
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多