Laravel联合几个表并按列对结果进行排序

时间:2016-12-15 17:42:22

标签: php mysql laravel eloquent

我有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');

或类似的东西。

3 个答案:

答案 0 :(得分:1)

您可以使用 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

答案 1 :(得分:0)

这应该对你有用:)

$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();

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

答案 2 :(得分:0)

您可以执行以下操作:

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

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

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

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