所以我试图在查询中获取不同pid的数量,但返回的值是错误的。
这是我尝试做的事情:
$ad->getcodes()->groupby('pid')->distinct()->count()
什么返回值" 2",而它应该返回的值应该是" 1"。
作为解决方法,我这样做:
count($ad->getcodes()->groupby('pid')->distinct()->get())
什么工作正常并返回" 1"
是否有任何规则,count和distinct不能在同一个查询中?我发现解决方法类似于" heavy",我想让原始查询工作:(
答案 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)
答案 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')