关于调试的注意事项
这两种不同方法生成的查询完全不同,这就是您发生这种情况的原因。每当您遇到数据库问题时,查看底层查询日志总是一个好主意,这样您就可以通过执行以下操作来查看正在执行的内容:
dd(DB::getQueryLog());
这将打印出查询日志,如果您在有问题的查找之后立即执行此操作,则可以转到最新查询的日志末尾(即,如果您将其放在第二次查找之后,则日志中的最后一个查询将是你的包装计数器,最后一个查询将是 count 方法)。
您的具体问题
无论如何,解释一下你的具体问题。正在生成的两个查询将类似于
DB::table('user_visits')->groupBy('user_id')->count();
// SELECT COUNT(*) from user_visits GROUP BY user_id
这将返回每组中的条目数。 mysql 正在做的是按 user_id 列对所有行进行分组,然后每组返回一行及其计数。如果我们将“user_id”添加到选择列中,并针对数据库手动运行查询,您可能会看到类似这样的结果
// SELECT user_id, COUNT(*) FROM user_visits GROUP BY user_id
----------------------
| user_id | COUNT(*) |
----------------------
| 1 | 8 |
| 2 | 4 |
| 5 | 11 |
----------------------
您的第二个查询不同
DB::table('user_visits')->groupBy('user_id')->get()
// SELECT * FROM user_visits GROUP BY user_id
它所做的只是选择所有条目,将它们分组并返回它们。这会导致每个用户 id 返回一行,并且该行包含该 user_id 的一个条目的所有信息(它可能是该用户的第一个条目,也可能是最后一个条目,也可能是随机的) ,不过没关系)。
Your count()
然后计算返回的行数,这将是唯一 user_ids 的计数。
因此,您的第一个查询是计算每个组有多少个 user_id (当您尝试打印结果时,laravel 将返回第一条记录,这会导致显示结果集中第一个 user_id 的条目数),以及第二个查询查询(加上应用的计数函数)返回找到了多少组(即唯一 user_ids 的数量)。
使用上面的表格来说明这一点......
查询 1:将返回“8”,因为这是结果集中第一个条目的计数
查询 2:将返回“3”,因为这是结果集中的行数的计数
想要正确的数字,而不加载所有数据?
如果您想要第二个查询的正确结果,但想要查询 1 的轻量级、网络负载较小的单个整数响应,您可以执行以下操作:
DB::table('user_invites')->count(DB::raw('DISTINCT user_id'))
结果是:
SELECT COUNT(DISTINCT user_id) FROM user_visits;
希望这一切都有道理,我确信你的头脑有点混乱