【问题标题】:Laravel - using sum() with groupBy() does not return groupBy column with null valueLaravel - 使用 sum() 和 groupBy() 不会返回空值的 groupBy 列
【发布时间】:2020-05-26 23:36:47
【问题描述】:

我正在尝试按 time_ids 获取金额总和。我将以下 time_ids 作为数组传递。

雄辩的查询如下

$time_ids = [1, 2, 3, 4];

$amount = Data::selectRaw('ifnull(sum(amount),0) as amount')
    ->whereIn('time_ids', $time_ids)
    ->groupBy('time_ids')
    ->pluck('amount')
    ->toArray();

结果我得到了一个只有 3 个值的数组。

在我的数据库中,time_ids = 1 不会有任何值,但如果找不到任何值,我希望查询返回 0。

【问题讨论】:

  • 这是左连接方案。从一个表中获取所有记录以及另一个表中匹配某些条件的记录(总和)。
  • @Erich,我尝试使用左连接但得到了相同的结果。我的查询如下。 Data::selectRaw('ifnull(sum(b.amount),0) as new_amount')->leftJoin('data as b', 'data.id', '=', 'b.id')->whereIn('data.time_ids',$time_ids)->groupBy('data.time_ids')->pluck('new_amount')->toArray();
  • 您对->toSql() 的查询最后会产生什么结果?将其与类似问题中接受的答案进行比较,例如stackoverflow.com/a/18129785/4468423
  • @ahu-son 您的表数据应该包含带有time_ids = 1 的行,然后它将返回您期望的结果.. :)
  • @UrjaSatodiya,我希望结果具有 time_ids 1(即我通过的所有时间 id)并且相应的总和为 0,即使数据库没有该特定 time_id 的任何值。有没有其他方法可以尝试实现这一目标?

标签: laravel laravel-query-builder


【解决方案1】:

没有足够的声誉,因此将其添加为答案。你的查询对我来说很好。尝试直接查询数据库并查看它返回的内容。使用它来生成原始 sql

$amount = Data::selectRaw('ifnull(sum(amount),0) as amount')->whereIn('time_ids',$time_ids)->groupBy('time_ids')->toSql();

【讨论】:

    猜你喜欢
    • 2019-02-02
    • 2018-02-07
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 2016-05-06
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多