Laravel Eloquent -distingle()和count()不能一起正常工作


95

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

这是我尝试做的:

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

返回值“ 2”的值应该返回“ 1”。

作为一种解决方法,我正在这样做:

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

什么工作正常并返回“ 1”

是否有任何规则在同一查询上不能包含计数和不重复?我找到一种“沉重”的解决方法,我想使原始查询工作:(


您在数据库的样本表中拥有什么?您想实现什么?现在,你或许应该得到不同的值的数pid列,所以如果你有你的表2的记录-一个用PID 1,第二位PID 2,计数应返回2
马辛Nabiałek

您可以这样简单地将get替换为count: $count = DB::table('tablename')->count(DB::raw('DISTINCT pid')); 也可以这样做: DB::table('tablename')->distinct('pid')->count('pid');
bharat

Answers:


123

以下应该工作

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

2
发生了类似的问题,看来只是解决了groupBy问题。
jeteon 2015年

8
Distinct不接受任何参数。在构建查询时调用distinge()只是将受保护的布尔值设置为true,该参数将被忽略。
马特·麦克唐纳

在L5.1上,这仍然无法正常工作。使用count()似乎会禁用或删除distinct()groupBy()按照整个问题所述使用。编辑:我发现甚至groupBy()提供了一个不同的count()比较,get()然后计数结果数组。
杰森

@杰森我和你做了同样的观察。请参阅我的答案以寻求解决方案。
Zoon

21
distinct()函数不带参数。您可以将其更改$ad->getcodes()->distinct()->count('pid');为相同的结果。
Trevor Gehman

26

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

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

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

解决方法:

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

17

其他人遇到这篇文章,没有找到其他建议起作用吗?

根据特定的查询,可能需要不同的方法。就我而言,我需要计算a的结果GROUP BY,例如

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

或使用COUNT(DISTINCT b)

SELECT COUNT(DISTINCT b) FROM a

经过一番摸索后,我意识到这两种功能都没有内置的Laravel功能。因此,最简单的解决方案是DB::rawcount方法一起使用。

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

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


$ builder来自哪里?
安德鲁(Andrew)

1
@Andrew您用于查询的Laravel查询构建器。例如,一个雄辩的对象$books = Book::where(...)->count(...)
Zoon

->count(DB::raw('DISTINCT b'))生成与->distinct()->count('b')
Trevor Gehman

5

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

问题在于Laravel的查询生成器处理聚合的方式。它采用返回的第一个结果,然后返回“合计”值。通常这很好,但是当您将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

我遇到了同样的问题。

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

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

改成

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

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


4

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

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

$count = $data->count();

希望这会起作用。


1

这行不行吗?

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

请参阅此处进行讨论。


3
这不是一个好的解决方案,因为该get()调用将执行查询并从数据库返回结果,然后count()在Collection上运行。
Trevor Gehman

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

请记住group by是可选的,在大多数情况下,当您希望count group by排除重复的选择值时,此方法应该起作用,addSelect是querybuilder实例方法。


0

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


0

基于Laravel文档的原始查询,我能够获得一个选择字段的计数,以便在产品模型中使用此代码。

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
]

-1

这对我有用,所以请尝试:$ ad-> getcodes()-> distinct('pid')-> count()


您好,欢迎来到SO。回答问题时,请提供您提供的代码的其他信息。这样的贡献值得欢迎,但将来的其他人可能会从镜头解释中受益
Deepend

-3

试试这个

$ad->getcodes()->groupby('pid')->distinct()->count('pid')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.