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

Laravel Eloquent - distinct() and count() not working properly together

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

这是我尝试做的事情:

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

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

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

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

什么工作正常,returns "1"

是否有任何规则不能在同一个查询中使用 count 和 distinct?我找到了 "heavy" 的解决方法,我想让原来的查询工作:(

以下应该有效

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

这对我有用 试试这个: $ad->getcodes()->distinct('pid')->count()

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

问题在于 Laravel 的查询生成器处理聚合的方式。它采用返回的第一个结果,然后是 returns 'aggregate' 值。这通常很好,但是当您将 count 与 groupBy 结合使用时,您将返回每个分组项目的计数。所以第一行的聚合只是第一组的计数(所以可能是 1 或 2 之类的低值)。

所以 Laravel 的计数已经用完了,但我将 Laravel 查询生成器与一些原始 SQL 结合使用以获得分组结果的准确计数。

对于您的示例,我希望以下内容应该有效(并让您避免 get):

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

如果您想确保没有浪费时间选择所有列,您可以在构建查询时避免这样做:

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

还有其他人遇到此问题 post,但找不到其他可行的建议吗?

根据具体的查询,可能需要不同的方法。就我而言,我需要计算 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'));

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

我遇到了同样的问题。

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

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

改为

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

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

这不行吗?

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

参见 here 进行讨论..

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

不起作用(returns 所有行数):

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

修正:

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

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

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

记住 group by 是可选的,在大多数情况下,当您希望计数 group by 排除重复的 select 值时,addSelect 是一个 querybuilder 实例方法。

试试这个

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

您可以使用以下方式根据需要获取唯一数据,如下所示,

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

$count = $data->count();

希望这会奏效。

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

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
]