首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >雄辩的计数distinct返回错误的总数

雄辩的计数distinct返回错误的总数
EN

Stack Overflow用户
提问于 2014-05-16 06:16:26
回答 3查看 4.4K关注 0票数 6

我有一个问题,那就是如何制定一个我无法访问的查询。当做像这样的事情时

代码语言:javascript
运行
复制
$model->where('something')
->distinct()
->paginate();

eloquent运行一个查询来获取总计数,该查询如下所示

代码语言:javascript
运行
复制
select count(*) as aggregate from .....

问题是,如果在查询中使用distinct,则需要类似于

代码语言:javascript
运行
复制
select count(distinct id) as aggregate from .....

才能得到正确的总数。然而,Eloquent并没有这样做,因此返回了错误的总数。获取distinct in计数的唯一方法是通过查询构建器传递一个参数,例如->count('id'),在这种情况下,它将添加该参数。问题是这个查询是自动生成的,我无法控制它。

有没有办法诱使它在count查询中添加distinct?

P.S深入研究构建器代码,我们发现一个IF语句请求count()方法上的一个字段,以便将distinct属性添加到计数中。Illuminate\Database\Query\Grammars\BaseGrammar@compileAggregate

代码语言:javascript
运行
复制
if ($query->distinct && $column !== '*')
{
   $column = 'distinct '.$column;
}
return 'select '.$aggregate['function'].'('.$column.') as     aggregate';

P.S.1我知道在SQL中你可以做一个group by,但由于我渴望加载东西,这不是一个好主意,因为它会在每个其他查询中添加一个in (找到的id的数量),这会显着减慢速度。

EN

Stack Overflow用户

发布于 2017-03-14 02:06:05

我遇到了完全相同的问题,并找到了两个解决方案:

不好的

代码语言:javascript
运行
复制
$results = $model->groupBy('foo.id')->paginate();

它可以工作,但如果您有大量的行数(这是我的情况),那么它将消耗太多的内存(和时间)。

更好的

代码语言:javascript
运行
复制
$ids = $model->distinct()->pluck('foo.id');
$results =  $query = $model->whereIn('foo.id', $ids)->paginate();

我试了一下,结果是100k,一点问题都没有。

票数 0
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23689601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档