Laravel雄辩 – distinct()和count()不能正常工作在一起

所以我试图得到一个查询不同的pid的数量,但返回的值是错误的。

这是我试图做的:

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

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

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

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

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

count和distinct是不是有相同的查询规则? 我find了解决方法种“重”,我想使原来的查询工作:(

以下应该工作

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

还有人遇到这个post,没有find其他的build议工作?

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

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

或使用COUNT(DISTINCT b)

 SELECT COUNT(DISTINCT b) FROM a 

经过一番困惑之后,我意识到没有内置的Laravelfunction。 所以最简单的解决scheme是使用DB::rawcount方法。

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

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

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

问题是Laravel的查询生成器处理聚合的方式。 它将返回第一个结果,然后返回“聚合”值。 这通常是好的,但是当你把计数与groupBy结合起来,你将返回每个分组项目的计数。 所以第一行的聚合只是第一组的计数(所以可能是像1或2这样低的东西)。

所以Laravel的计数已经出来了,但是我将Laravel查询生成器与一些原始SQL结合起来,以便精确计算我的分组结果。

对于你的例子,我期望下面的工作(并让你避免得到):

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

如果你想确保你不浪费时间select所有的列,你可以避免在build立你的查询时:

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

这不会工作吗?

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

参阅这里讨论..

尝试以下操作:

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

我遇到了同样的问题。

如果你安装laraveldebugging栏,你可以看到查询,并经常看到问题

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

改成

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

您需要将值设置为不同。 如果您不设置select字段,它将返回数据库中的所有列,并且全部将是唯一的。 因此,将查询设置为不同的,并只select组成您可能想要添加更多的“独特”值的列。 ->select('pid','date')在一天中获取用户的所有唯一值

这是我的工作,所以试试这个:$ ad-> getcodes() – > distinct('pid') – > count()

Interesting Posts