我有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');
或类似的东西。
答案 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');