Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 联接表中的总和不正确_Mysql_Laravel_Laravel 5_Eloquent - Fatal编程技术网

Mysql 联接表中的总和不正确

Mysql 联接表中的总和不正确,mysql,laravel,laravel-5,eloquent,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('s

我需要将管理员的总数添加到事务中。事务被拆分为多个表,现在我想分别从这两个表中得到一个总数。结果我得到的结果是荒谬的高。我不确定是不是我的查询乘以了某个地方的值

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的解决方案,下面是错误消息:

->合并绑定$CUT Symfony\Component\Debug\Exception\FatalThrowableError:类型错误:传递给illumb\Database\Query\Builder::mergeBindings的参数1必须是illumb\Database\Query\Builder的实例

->合并绑定$CUT->getBindings Symfony\Component\Debug\Exception\FatalThrowableError:类型错误:传递给illumb\Database\Query\Builder::mergeBindings的参数1必须是给定数组的illumb\Database\Query\Builder的实例

->加价$CUT ErrorException:无法将Illumb\Database\Eloquent\Builder类的对象转换为字符串


由于左联接,您得到了错误的总和,并且每个联接的表可能每个用户都有多行,这使得总和远远高于原始的总和。要解决这个问题,您需要在单个子子句中计算这些总和,然后使用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();

@我是Khalid Junaid,谢谢你的及时回复,兄弟。我正在尝试代码,它显示了我的一些绑定错误。绑定到底是什么意思?调用未定义的方法Illumb\Database\Query\JoinClause::addBinding@1myb根据try更新的答案,可能join部分中的绑定已从较新版本中删除,希望如此helps@MKhalid Junaid,我用不同绑定方式的结果更新了问题。不幸的是,它还不起作用。感谢您进行了一些研究,我想是因为我没有使用Union,所以无法使用合并绑定。我试图将代码更新为->合并绑定$CUT->getQuery,但结果是空的results@MKhalid Junaid,我使用DB::raw来执行解决方案中提供的SQL。谢谢