我有2个表,有用户数据。我想从这两个表中获取指定日期之间的数据,如果两个表中存在同一用户,则将它们添加在一起,如果不是,则将它们写为单个数据。我做了如下的join操作,但是unionAll方法合并了2条SQL结果中的数据,但是并没有收集到相同的用户数据。例如,id为1的用户在表中记录为publisher_id,我要收集的列名是ticket。在另一个表中,有一条记录为user_id,我要收集的列名是diamonds。如果一个表中的票值是 10,而另一个表中的钻石值是 20,则结果应该是 30,但会出现两个单独的数据。如何使用分页管理进行合并?
public function index(Request $request)
{
$begin_date = $request->get('begin_date') ? date('Y-m-d 00:00:00', strtotime($request->get('begin_date'))) : now()->startOfMonth();
$end_date = $request->get('end_date') ? date('Y-m-d 23:59:59', strtotime($request->get('end_date'))) : now()->endOfMonth();
$begin_time = strtotime($begin_date);
$end_time = strtotime($end_date);
$a_recharges = ARecharge::select('publisher_id as user_id', DB::raw('SUM(ticket) as coins'))
->whereBetween('created_at', [$begin_date, $end_date])
->groupBy('publisher_id');
$b_recharges = BRecharge::select('user_id', DB::raw('SUM(diamonds) as coins'))
->whereBetween('create_time', [$begin_time, $end_time])
->groupBy('user_id');
$recharges = $a_recharges->union($b_recharges)
->orderByDesc('coins')
->paginate(10)
->appends($request->except('page'));
return view('admin.publisherrecharges.index', compact('recharges'));
}
我尝试了unionAll方法,但结果不是我想要的
您没有执行 join 操作,而是执行了 union 操作,这就是您在结果集中没有获得所需输出的原因。
Union:- 用于将两个或多个 SELECT 语句的结果组合成一个结果集。
联接:- 用于根据两个或多个表之间的相关列组合来自两个或多个表的行。
试试这个...
public function index(Request $request)
{
$begin_date = $request->get('begin_date') ? date('Y-m-d 00:00:00', strtotime($request->get('begin_date'))) : now()->startOfMonth();
$end_date = $request->get('end_date') ? date('Y-m-d 23:59:59', strtotime($request->get('end_date'))) : now()->endOfMonth();
$begin_time = strtotime($begin_date);
$end_time = strtotime($end_date);
$join_result = DB::table('ARecharge')
->leftJoin('BRecharge', 'ARecharge.user_id', '=', 'BRecharge.user_id')
->where('ARecharge.publisher_id','=','BRecharge.user_id')
->whereBetween('ARecharge.created_at', [$begin_date, $end_date])
->whereBetween('BRecharge.create_time', [$begin_time, $end_time])
->select(
'ARecharge.*',
DB::raw('SUM(ARecharge.ticket) + SUM(BRecharge.diamonds) as total_coins')
)
->groupBy('ARecharge.user_id') //optionally you choose 'BRecharge.publisher_id'
->get();
}
尝试一下并告诉我。虽然我还没有测试过这个,但我相信它会适用于你的情况。