合并具有不同列名的数据

问题描述 投票:0回答:1

我有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方法,但结果不是我想要的

php mysql laravel
1个回答
0
投票

您没有执行 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();
}

尝试一下并告诉我。虽然我还没有测试过这个,但我相信它会适用于你的情况。

© www.soinside.com 2019 - 2024. All rights reserved.