mysql - 连接表的总金额不正确

标签 mysql laravel laravel-5 eloquent

我需要获取添加到交易中的管理员总和。交易被分成多个表,现在我想分别从两个表中获取总计。最终我得到的结果高得离谱。我不确定我的查询是否在某处乘以该值。

User::select('user.name as name',
                DB::raw('sum(CASE WHEN current.amount > 0 THEN current.amount END) as current_positive'),
                DB::raw('sum(CASE WHEN current.amount < 0 THEN current.amount END) as current_negative'),
                DB::raw('sum(CASE WHEN cash.amount > 0 THEN cash.amount END) as cash_positive'),
                DB::raw('sum(CASE WHEN cash.amount < 0 THEN cash.amount END) as cash_negative')
                )->leftjoin('current_transaction as current', 'current.created_by', '=', 'user.id')
                ->leftjoin('cash_transaction as cash', 'cash.created_by', '=', 'user.id')
                ->whereBetween('current.created_at', [$start_date->format('Y-m-d'), $end_date->format('Y-m-d')])
                ->whereBetween('cash.created_at', [$start_date->format('Y-m-d'), $end_date->format('Y-m-d')])
                ->where('user.type', 3)
                ->groupBy('user.name')
                ->get();
<小时/>

更新

我正在尝试使用 M Khalid 的解决方案,以下是错误消息:

  1. ->mergeBindings($CUT)

Symfony\Component\Debug\Exception\FatalThrowableError: Type error: Argument 1 passed to Illuminate\Database\Query\Builder::mergeBindings() must be an instance of Illuminate\Database\Query\Builder

  • ->mergeBindings($CUT->getBindings())
  • Symfony\Component\Debug\Exception\FatalThrowableError: Type error: Argument 1 passed to Illuminate\Database\Query\Builder::mergeBindings() must be an instance of Illuminate\Database\Query\Builder, array given

  • ->addBinding($CUT)
  • ErrorException: Object of class Illuminate\Database\Eloquent\Builder could not be converted to string

    最佳答案

    由于左连接,您得到了错误的总金额,并且每个连接的表可能每个用户有不止一行,这使得总金额比原始总金额高得多,要解决此问题,您需要计算这些总金额在各个子条款中,然后将它们与 main 有点像

    select users.name as name,cu.*,ca.*
    from users
    left join (
        select created_by,
        sum(CASE WHEN amount > 0 THEN amount END) as current_positive,
        sum(CASE WHEN amount < 0 THEN amount END) as current_negative
        from current_transaction
        where created_at between :start_date and :end_date
        group by created_by
    ) cu on users.id = cu.created_by
    left join (
        select created_by,
        sum(CASE WHEN amount > 0 THEN amount END) as cash_positive,
        sum(CASE WHEN amount < 0 THEN amount END) as cash_negative
        from cash_transaction
        where created_at between :start_date and :end_date
        group by created_by
    ) ca on users.id = ca.created_by
    where users.type = 3
    

    在 Laravel 中执行上述操作非常复杂,就像每个子子句获取 sql 和查询构建器对象,然后在主查询中使用它们,如下所示

    // For current_transaction
    $CUT = CurrentTransaction::query()
        ->select('created_by',
                  DB::raw('sum(CASE WHEN amount > 0 THEN amount END) as current_positive'),
                  DB::raw('sum(CASE WHEN amount < 0 THEN amount END) as current_negative')
                )
        ->from('current_transaction')
        ->whereBetween('created_at', [$start_date->format('Y-m-d'), $end_date->format('Y-m-d')])
        ->groupBy('created_by');
    $CUTSql = $CUT->toSql();
    
    // For cash_transaction
    $CAT = CashTransaction::query()
        ->select('created_by',
                  DB::raw('sum(CASE WHEN amount > 0 THEN amount END) as cash_positive'),
                  DB::raw('sum(CASE WHEN amount < 0 THEN amount END) as cash_negative')
                )
        ->from('cash_transaction')
        ->whereBetween('created_at', [$start_date->format('Y-m-d'), $end_date->format('Y-m-d')])
        ->groupBy('created_by');
    $CATSql = $CAT->toSql();
    
    // Main query
    User::select('user.name as name','cu.*','ca.*')
        ->leftjoin(DB::raw('(' . $CUTSql. ') AS cu'),function($join) use ($CUT) {
                $join->on('user.id', '=', 'cu.created_by');
                /* ->addBinding($CUT->getBindings());*/
        })
        ->leftjoin(DB::raw('(' . $CATSql. ') AS ca'),function($join) use ($CAT) {
                $join->on('user.id', '=', 'ca.created_by');
                /* ->addBinding($CAT->getBindings());  */
        })
        ->where('user.type', 3)
        ->mergeBindings($CUT) /* or try with ->mergeBindings($CUT->getBindings()) */
        ->mergeBindings($CAT) /* or try with ->mergeBindings($CAT->getBindings()) */
        ->get();
    

    关于mysql - 连接表的总金额不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47654789/

    相关文章:

    mysql - MySQL 中何时使用单引号、双引号和反引号

    php - 做一个图库,怎么做?

    mysql - 使用 Express 更改回调内的 session 对象

    laravel - 似乎由于版本不兼容而无法安装 laravel/sail

    laravel - 在 null 上调用成员函数 getRealPath()

    php - 如何在 PHPUnit 中测试 cmp()

    网站上的 PHP 文件 - mysql_connect() 中出现 fatal error

    php - 如何在 Laravel 5.2 中编写 >= Eloquent 数据库查询

    php - Laravel 避免子表中的重复条目

    php - Laravel Passport Auth 在独立项目上运行基于密码的 token 身份验证时卡住