Laravel Eloquent - distinct()和count()不能正常工作

时间:2015-02-21 21:44:28

标签: laravel count eloquent distinct

所以我试图在查询中获取不同pid的数量,但返回的值是错误的。

这是我尝试做的事情:

$ad->getcodes()->groupby('pid')->distinct()->count()

什么返回值" 2",而它应该返回的值应该是" 1"。

作为解决方法,我这样做:

count($ad->getcodes()->groupby('pid')->distinct()->get())

什么工作正常并返回" 1"

是否有任何规则,count和distinct不能在同一个查询中?我发现解决方法类似于" heavy",我想让原始查询工作:(

14 个答案:

答案 0 :(得分:79)

以下内容应该有效

$ad->getcodes()->distinct('pid')->count('pid');

答案 1 :(得分:11)

其他人遇到过这篇文章,而没有找到其他建议吗?

根据具体的查询,可能需要采用不同的方法。就我而言,我需要计算GROUP BY的结果,例如

SELECT COUNT(*) FROM (SELECT * FROM a GROUP BY b)

或使用COUNT(DISTINCT b)

SELECT COUNT(DISTINCT b) FROM a

经过一番困惑,我意识到其中任何一个都没有内置的Laravel功能。因此,最简单的解决方案是使用DB::raw方法使用count

$count = $builder->count(DB::raw('DISTINCT b'));

请记住,在致电groupBy之前不要使用count。如果您需要获取行,可以稍后申请groupBy

答案 2 :(得分:11)

一个更通用的答案可以节省我的时间,并希望其他人:

不起作用(返回所有行的计数):

function nothing() {

  var inputs = document.getElementsByClassName('checking');

  function doSetTimeout(i) {
    setTimeout(function() {
      inputs[i].click();
    }, i * 1000);
  }

  for (var i = 0; i < inputs.length; i++) {
    var style = inputs[i].style;
    if (!style) {
      doSetTimeout(i);
    }
  }
}

修复:

DB::table('users')
            ->select('first_name')
            ->distinct()
            ->count();

答案 3 :(得分:3)

我遇到了类似的问题,并找到了解决问题的方法。

问题在于Laravel的查询构建器处理聚合的方式。它返回第一个结果,然后返回&#39;聚合&#39;值。这通常很好,但是当你将count与groupBy结合使用时,你会返回每个分组项目的计数。所以第一行的聚合只是第一组的计数(因此可能会出现像1或2这样的低点)。

所以Laravel的计数已经结束,但我将Laravel查询构建器与一些原始SQL结合起来,以准确计算我的分组结果。

对于您的示例,我希望以下内容可以正常工作(并且让您避免获取):

$query = $ad->getcodes()->groupby('pid')->distinct();
$count = count(\DB::select($query->toSql(), $query->getBindings()));

如果您想确保不浪费时间选择所有列,则可以在构建查询时避免这种情况:

 $query = $ad->select(DB::raw(1))->getcodes()->groupby('pid')->distinct();

答案 4 :(得分:2)

您可以按照以下方式使用以下方法获取唯一数据,

$data = $ad->getcodes()->get()->unique('email');

$count = $data->count();

希望这会起作用。

答案 5 :(得分:1)

这不会起作用吗?

$ad->getcodes()->distinct()->get(['pid'])->count();

请参阅here进行讨论..

答案 6 :(得分:0)

我遇到了同样的问题。

如果您安装了laravel调试栏,您可以看到查询并经常看到问题

$ad->getcodes()->groupby('pid')->distinct()->count()

更改为

$ad->getcodes()->distinct()->select('pid')->count()

您需要将值设置为不同的返回值。如果您没有设置选择字段,它将返回数据库中的所有列,并且所有列都是唯一的。因此,请将查询设置为“不同”,并仅选择构成“不同”的列。您可能想要添加更多的价值。 ->select('pid','date')获取一天中用户的所有唯一值

答案 7 :(得分:0)

Distinct不接受参数,因为它在SQL查询中添加了DISTINCT,但是,您可能需要定义要与之选择的列名。因此,如果您有 Flight->select('project_id')->distinct()->get()SELECT DISTINCT 'project_id' FROM flights等效,您现在可以添加其他修饰符,例如count()或原始的雄辩查询。

答案 8 :(得分:0)

$solution = $query->distinct()
            ->groupBy
            (
                [
                    'array',
                    'of',
                    'columns',
                ]
            )
            ->addSelect(
                [
                    'columns',
                    'from',
                    'the',
                    'groupby',
                ]
            )
            ->get();

记住分组依据是可选的,在大多数情况下,当您希望计数分组依据排除重复的选择值(addSelect是querybuilder实例方法)时,此方法应该适用。

答案 9 :(得分:0)

基于Laravel docs for raw queries,我能够获得一个用于在产品模型中使用此代码的选择字段的计数。

public function scopeShowProductCount($query)
{
    $query->select(DB::raw('DISTINCT pid, COUNT(*) AS count_pid'))
          ->groupBy('pid')
          ->orderBy('count_pid', 'desc');
}

此外观可在控制器中获得相同的结果:

$products = DB::table('products')->select(DB::raw('DISTINCT pid, COUNT(*) AS count_pid'))->groupBy('pid')->orderBy('count_pid', 'desc')->get();

两个查询的结果转储如下:

#attributes: array:2 [
  "pid" => "1271"
  "count_pid" => 19
],
#attributes: array:2 [
  "pid" => "1273"
  "count_pid" => 12
],
#attributes: array:2 [
  "pid" => "1275"
  "count_pid" => 7
]

答案 10 :(得分:-1)

尝试以下方法:

$ad->getcodes()->groupby('pid')->distinct()->get()->count()

答案 11 :(得分:-1)

这对我有用 试试这个: $ AD-&GT; getcodes() - &GT;不同(&#39; PID&#39;) - &GT;计数()

答案 12 :(得分:-1)

DB::table('adverts')->distinct()->select('ad_advertiser')->get()

答案 13 :(得分:-1)

尝试

$ad->getcodes()->groupby('pid')->distinct()->count('pid')