2016-12-15 173 views
0

我有4个单独的select查询,每个查询都会生成一个具有相同列的表,如id和created_at。 我想要union,然后按created_at排序并获取每个id的最近的created_at。所以我还需要使用group by。Laravel union几个表并按列排序结果

从文档的结果(select ..) union (select ...)的例子,但我无法弄清楚如何做类似

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

或类似的东西。

回答

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

让我知道,如果你面对任何问题:)

+0

它导致不同的查询。我想“选择*从(联合...)组编号”,我得到(选择*从表组ID)联合(...) – Victor

+0

@Victor现在检查?编辑我的回答 – prateekkathal

0

你可以做到以下几点:

  • 合并所有查询集合

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

  • 添加你需要收集方法

$过滤= $收藏 - > GROUPBY( '身份证') - > sortBy( '​​created_at');

+0

如果数据库中有很多行,则会出现内存问题。就像想象有100k行,我会创建100k项目的集合 – Victor