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。谢谢