DB->count() 返回与 count(DB->get()) 不同的值

2024-03-09

我正在尝试运行最简单的查询

DB::table('user_visits')->groupBy('user_id')->count();

但它返回了错误的数字,8。

如果我把它改成这样:

count(DB::table('user_visits')->groupBy('user_id')->get());

然后它返回正确的数字 34。为什么这些值不同?

这是我的表结构

user_visits( user_id, date_visited, num_clicks )

关于调试的注意事项
这两种不同方法生成的查询完全不同,这就是您发生这种情况的原因。每当您遇到数据库问题时,查看底层查询日志总是一个好主意,这样您就可以通过执行以下操作来查看正在执行的内容:

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;

希望这一切都有道理,我确信你的头脑有点混乱

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DB->count() 返回与 count(DB->get()) 不同的值 的相关文章

随机推荐

  • 使用 Windows 成像组件 (WIC) 的 Delphi 2007

    我需要在Delphi 2007中读取一些大约1 7mb的图片并将其从jpg转换为bmp 有些图片被剪切 灰度或转换后最差 我进行了搜索 但没有找到在 delphi 2007 中添加像 TWicImage 这样的 WIC 例程的技巧 我在某处
  • 在 JSR-310 中计算修改后的儒略日

    如何从 JSR 310 类计算修改后的儒略日 例如LocalDate 在 JDK 8 中 具体来说 这是计算连续计算天数 http en wikipedia org wiki Julian day被称为 修改儒略日 而不是日期儒略历系统 h
  • 当我使用 pip 安装任何包时出现 WinError 10013

    我试图在 Windows 上的 Python 环境中安装软件包 每次这样做时 pip install pacakgename 我收到此错误 Retrying Retry total 4 connect None read None redi
  • 如何在 Visual Studio 中使用 C++ shlwapi 库?

    我的程序使用PathFileExistsW https learn microsoft com windows win32 api shlwapi nf shlwapi pathfileexistsw函数来自shlwapi h includ
  • 控制器如何接收 HttpPost 方法上的参数?

    从控制器中取出此代码片段 例如 public ActionResult Login if User Identity IsAuthenticated return RedirectToAction Index Home else retur
  • 已移至 Tensorflow 2.0,训练现在在第三步后挂起

    最近我决定从 Tensorflow GPU 变体 版本 1 14 迁移到当前版本 2 0 我当前的设置是 Tensorflow GPU 变体 2 0 库德恩7 6 4 CUDA 10 Python 3 6 集成开发环境 Visual Stu
  • AJAX GET 竞争条件?

    我试图以类似于以下的方法跟踪在我的网站上单击链接时的事件 a href example class track Example a
  • 如何在 IntelliJ IDEA 中使用键盘弹出错误窗口

    当使用 IntelliJ IDEA 并编写代码时 当您编写的代码出现错误时 我知道让 IDEA 显示错误详细信息的唯一方法是将鼠标光标悬停在问题上 但这需要我将手从键盘移到鼠标上 是否有一个热键会导致出现带有错误消息的弹出窗口 或者是否有配
  • Angular 2(Ionic 2)在显示页面时调用页面中的函数

    每当我的主页出现在angular 2 ionic 2 应用程序已加载我想要呼叫服务 功能 如何实现这一目标 第一次加载应用程序时 加载主页 我可以在constructor 但是当用户开始使用该应用程序并且push新页面进入nav contr
  • Response.write 和 ASP.NET 控件

    请看下面的代码 Protected Sub Page Load ByVal sender As Object ByVal e As EventArgs Handles Me Load Response Write table tr td s
  • Docker 服务禁用内存交换

    我可以为docker服务设置 MemorySwap 和 MemorySwappiness 吗 我想禁用 docker 容器的内存交换 由 docker 服务启动 但我不想为主机禁用它 MemorySwappiness 中的 1 值意味着什么
  • 在MFC项目中使用多个资源文件

    我在 VS2015 中使用 MFC C 11 并且有一组独立的 GUI 我想在多个项目中使用它们 我知道这可以通过创建一个 rc 文件来实现 该文件可以包含在每个项目的主 rc 文件中 使用多个资源文件 https msdn microso
  • System.DirectoryServices.DirectoryServicesCOMException:发生操作错误

    我有相同的网络应用程序在其他三台服务器上运行 有人知道为什么第四台服务器无法工作吗 查看错误和堆栈跟踪 发生操作错误 描述 执行期间发生未处理的异常 当前的网络请求 请查看堆栈跟踪以了解更多信息 有关错误及其在代码中的来源的信息 异常详细信
  • 重新定位 Jquery UI 自动完成结果框

    我正在使用 Jquery UI 自动完成插件作为直接的搜索词建议工具 它已启动并运行 没有任何问题 只是我无法移动结果框 我基本上需要将其向左移动 20 像素 向下移动 4 像素 我尝试覆盖 Jquery UI CSS 但无法重新定位该框
  • 生成包含 `partykit:mob()` 对象的并排节点模型的表

    假设我使用以下方法拟合模型partykit mob 之后 我想生成一个包含所有节点的并排表 包括使用整个样本拟合的模型 在这里我尝试使用stargazer 但其他方式也非常受欢迎 下面是一个例子并尝试获取表格 library partyki
  • Istio 从 ext-auth 中排除服务

    大家好 我已经在 minikube 上设置了 istio 并在网关上设置了 envoy ext auth 过滤器 我有两个微服务在不同的 Pod 中运行 向外界公开虚 拟服务 auther 和 appone 我设置的 ext auth 过滤
  • 将数据框中的每个列表转换为普通列

    我从网络上的多个来源生成了一个数据框 这些数据框事先经过清理 然后使用 cleans lt ls cleans lt cleans grepl Clean News cleans 我第一次尝试将它们绑定在一起的灵感来自 Stack Over
  • 嵌入 YouTube 播放列表,以便播放列表选项始终可见。

    有没有办法利用带有播放列表的 YouTube 嵌入式播放器并使播放列表始终可见 或者 有没有办法默认打开播放列表按钮 到目前为止 我的研究表明 showinfo 1 选项用于使播放列表始终可见 但这似乎不再起作用 showinfo 仅适用于
  • 按顺序插入数组

    简单来说 我正在处理的项目的一部分让我采用按顺序降序的数组并添加一个元素 以便数组保持顺序 最初我以为只要将元素添加到数组中 然后实现 Comparable 后进行排序就可以了 但后来发现任何类型的排序算法都是被禁止的 收藏亦然 有点不知道
  • DB->count() 返回与 count(DB->get()) 不同的值

    我正在尝试运行最简单的查询 DB table user visits gt groupBy user id gt count 但它返回了错误的数字 8 如果我把它改成这样 count DB table user visits gt grou