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::raw
和 count
方法。
$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
]
所以我试图获取查询中不同 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::raw
和 count
方法。
$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
]