为什么这个 MySQL 查询的结果会相互相乘?

2024-03-16

SELECT user_id,
    SUM(COALESCE(point_points, 0)) AS total_points,
    SUM(
        CASE
            WHEN point_date > '$this_month'
            THEN point_points
            ELSE 0
        END)                AS month_points,
    COUNT(DISTINCT c_id)    AS num_comments,
    COUNT(DISTINCT rant_id) AS live_submissions
FROM users
    LEFT JOIN points
    ON  users.user_id = points.point_userid
    LEFT JOIN comments
    ON
        (
            c_userid = user_id
        )
    LEFT JOIN rants
    ON
        (
            rant_poster = user_id
        AND rant_status = 1
        )
WHERE user_id = $id
GROUP BY user_id

基本上live_submissions and num_comments变量显示正确的结果,而total_points and month_points显示产品month_points/total_points, live_submissions and num_comments。知道为什么会发生这种情况吗?


这被称为笛卡尔积 http://en.wikipedia.org/wiki/Cartesian_product。当您将表连接在一起时,默认结果是每个行的排列其连接条件为真。你用JOIN限制这些排列的条件。

但是由于您要将多个表连接到users,结果包括每个匹配表的每个排列。例如,每个匹配行points中的每个匹配行重复comments,并且每一个都再次相乘,对每个匹配行重复rants.

您可以通过以下方式部分补偿COUNT(DISTINCT c_id)正如你所做的那样,但是DISTINCT是必要的,只是因为每个有多个行c_id。除非您将其应用于独特的值,否则它不会起作用。这个补救措施对以下情况不起作用SUM()表达式。

基本上,您试图在一个查询中执行太多计算。您需要将其拆分为单独的查询才能保证其可靠性。然后你就可以摆脱DISTINCT修饰符也是如此。

SELECT u.user_id, SUM(COALESCE(p.point_points, 0)) AS total_points, 
  SUM( CASE WHEN p.point_date > '$this_month' THEN p.point_points ELSE 0 END ) AS month_points
FROM users u LEFT JOIN points p
  ON u.user_id = p.point_userid 
WHERE u.user_id = $id
GROUP BY u.user_id;

SELECT user_id, COUNT(c.c_id) as num_comments, 
FROM users u LEFT JOIN comments c
  ON (c.c_userid = u.user_id)
WHERE u.user_id = $id
GROUP BY u.user_id;

SELECT u.user_id, COUNT(r.rant_id) as live_submissions
FROM users u LEFT JOIN rants r
  ON (r.rant_poster = u.user_id AND r.rant_status = 1)
WHERE u.user_id = $id
GROUP BY u.user_id;

您不应该尝试在单个查询中完成所有这三个操作。

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

为什么这个 MySQL 查询的结果会相互相乘? 的相关文章

  • Rails 创建 schema_migrations - Mysql2::Error: 指定的键太长

    我正在使用Rails 3 2 6和Mysql 6 0 9 但我在MySQL 5 2 25上有完全相同的错误 当我创建新数据库时 rake db create 然后当我尝试加载架构时 rake schema load 我收到此错误 Mysql
  • 为什么 MySQL 将 é 与 e 视为相同?

    我使用 Django Web 应用程序将 Unicode 字符串存储在 MySQL 数据库中 我可以很好地存储 Unicode 数据 但是在查询时 我发现 and e被视为好像它们是同一个角色 In 1 User objects filte
  • 如何解决 MySQL Workbench 上的这些行错误?

    正如您所看到的 我的代码中没有语法错误或类似的错误 你们能帮我吗 我想这只是错误标记机制中的一个小错误 尝试编辑代码或关闭此编辑器并打开一个新编辑器 如果您有重现此问题的步骤列表 您甚至可以创建一个错误报告 http bugs mysql
  • 在数据库中存储差异的最紧凑方式是什么?

    我想实现类似于维基媒体的修订历史的东西 最好使用的 PHP 函数 库 扩展 算法是什么 我希望差异尽可能紧凑 但我很高兴只能显示每个修订版与其同级修订版之间的差异 并且一次只能回滚一个修订版 在某些情况下 只有几个字符可能会发生变化 而在其
  • MySQL如何进行浮点加法的数学计算?

    我测试过SELECT 0 1 0 2 用MySQL MariaDB 查询 它返回了正确的答案 MariaDB none gt SELECT 0 1 0 2 0 1 0 2 0 3 1 row in set 0 000 sec 在大多数编程语
  • MySQL 性能 DELETE 或 UPDATE?

    我有一个超过 10 7 行的 MyISAM 表 向其中添加数据时 我必须在最后更新 10 行 删除它们然后插入新行更快 还是更新这些行更快 应更新的数据不是索引的一部分 索引 数据碎片怎么样 UPDATE到目前为止要快得多 当你UPDATE
  • RESTful Web 服务:java.lang.NullPointerException service.AbstractFacade.findAll

    我使用 NetBeans 7 的 来自数据库的 RESTful Web 服务 向导创建了一个简单的 XML Web 服务 此时 我想从关联的 mySQL 数据库发布用户列表 当我尝试通过其 URL http localhost 8080 d
  • MySQL 中有“connect by”替代方案吗?

    如果我使用 Oracle 有connect by可用于创建分层查询的关键字 目前我正在一个项目中使用MySQL 我想知道是否有替代方案connect by在 MySQL 中 我尝试过谷歌 但到目前为止还没有结果 我想要实现的是通过一个查询从
  • 如何在 Node.js 中使用 Winston 将日志存储到 mysql 数据库

    我正在使用 winston 为我的应用程序进行日志记录 我已经使用这个完成了文件传输 class LoggerHelper extends BaseHelper constructor cApp super cApp this props
  • PHP 5.4 PDO 无法使用旧的不安全身份验证连接到 MySQL 4.1+

    我知道有很多类似的问题 事实上我已经阅读了所有 9 个问题 但是 他们都没有解决我的问题 我有一个共享托管包 最低限度 我的包中包含域名和托管 MySQL 服务器的单独 IP 地址 为了开发 我正在使用http localhost 与 PH
  • 为什么我在 WinForms 列表框中得到“System.Data.DataRowView”而不是实际值?

    每当我运行代码并尝试查看highscore我在列表框中得到的只是System Data DataRowView 谁能明白为什么吗 Code MySqlConnection myConn new MySqlConnection connStr
  • 选择每组最新的项目[重复]

    这个问题在这里已经有答案了 可能的重复 检索每组中的最后一条记录 https stackoverflow com questions 1313120 retrieving the last record in each group 我有 2
  • Delphi XE5 FireDAC 错误:无法加载供应商库 [libmysql.dll 或 libmysqld.dll]

    我在 Windows 7 64 位上使用 Delphi XE5 只是尝试 FireDAC 组件 我正在使用一个 TFDConnection 组件连接到本地 MySQL 数据库 v5 6 15 我已经将 libmysql dll 32位 v5
  • 通过字符串操作预防 PHP SQL 注入[重复]

    这个问题在这里已经有答案了 可能的重复 PHP 中防止 SQL 注入的最佳方法 https stackoverflow com questions 60174 best way to prevent sql injection in php
  • 如何查找所有mysql表之间的所有关系?

    如何找到MySQL所有表之间的所有关系 例如 如果我想知道大约有 100 个表的数据库中表的关系 有什么办法知道这个吗 从编程角度来说 更好的方法是从以下位置收集数据 INFORMATION SCHEMA KEY COLUMN USAGE表
  • 级联删除时触发调用

    我在 MySQL 中有表 A 它有一些对其他表 B C D 的级联删除的引用 当从 A 中删除某些内容时 我需要使用触发器 当我直接从 A 删除记录时 此触发器起作用 但它不适用于级联删除 是否存在任何版本的 MySQL 可以让我的触发器与
  • Symfony/Doctrine 重新排列数据库列

    当我使用doctrine schema update命令行生成表时 Doctrine 或Symfony 似乎想要添加一个命令来重新排列我的列 将键放在它出现的前面 我想知道是否 更希望在哪里 我可以禁用环境的这个 功能 所以当我去生成我的表
  • 如何限制两个表之间一对多关系中的多个数量?

    我有一个带有两个 MySql 表的 MySQL 数据库 第一个是第一个表 表 A 有一列具有唯一值 从值 从 1 到 n 在第二个表 2 表 B 中 我有两列 在第一个表中我有一个名称 在第二个我的值从 1 到 n 如果我在 中添加一个值
  • Unicode(希腊语)字符存储在数据库中,例如“??????”

    数据库中的希腊字符就像问号 我找不到解决办法 我使用 Java Swing 开发了一个应用程序 但是当我在 MySQL 中插入希腊字母时 就像问号一样 我将数据库排序规则更改为 utf8 并将列也更改为 utf8 我的项目编码设置为UTF
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的

随机推荐

  • 将行添加到数据框中,并包含组内数据的总和

    我下面有一个示例数据框 eg data lt data frame time c 1 1 2 2 type c long short long short size c 200 50 500 150 我需要创建行来汇总每个时间段的大小值 我
  • 名称值对已弃用

    由于 Android 22 NameValuePair 已被弃用 The 文档 http developer android com reference org apache http message BasicNameValuePair
  • 监控所有使用网络的应用程序建立的连接的 IP 地址,无需 root Android 手机

    我正在尝试构建一个 Android 应用程序 无需 root 手机 该应用程序从所有应用程序与手机之间的网络连接收集 IP 地址 我负责这个项目 关键点是手机必须保持未root状态 这 据我所知 意味着我不能使用tcpdump或libpca
  • npm 5.4.1 安装/卸载全部失败

    我使用的是 Windows 10 我通过执行以下操作升级了我的 npmnpm i g npm 但是没有软件包正在安装或卸载 安装时它始终挂在安装后 如下所示 PS C Users Mercurius Documents GitHub cat
  • 如何在wpf画布控件中添加动态设计的用户控件时获取高度和宽度?

    您好 我正在开发一个 wpf 应用程序 我正在画布中添加 myUserControl 对象 我需要高度和添加的用户控制 现在的问题是用户控件是动态设计的 我正在创建网格并根据用户配置添加行和列 并且我在高度和宽度上给出自动 所以我在画布中添
  • 如何解决React redux中的数据加载问题

    我试图弄清楚当数据仍在加载时如何管理 显示此组件 我在这种情况下使用react redux 有什么解决这个问题的建议吗 虽然我用延迟加载来包装它 但在这种情况下似乎并没有那么有效 对此有何建议 动作 js export const getC
  • 如何从 Eclipse 中的接口导航到实现类? [复制]

    这个问题在这里已经有答案了 假设我有 interface Foo void doStuff class FooImpl implements Foo public void doStuff stuff 当我看见myFoo doStuff 在
  • 在带有数组的单个函数中多次调用“useVal” - 意外行为

    我打电话给我的useArr在单个函数调用中多次调用函数 每次致电useArr 我正在将新的价值推向现有的arr功能 我用一个令人震惊的每个电话pause功能 而不是渲染字符串abcde以逐步 间隔的方式 它只是覆盖前一个字母 我对引擎盖下的
  • Jenkins Github 插件 - 触发参数化构建

    我有一个 自由式项目 Jenkins 作业 它有一个参数 GIT BRANCH这样我就可以手动或通过 GitHub hook 触发它 问题是 GitHub 插件似乎无法正确识别 设置推送的分支 当我查看 Jenkins 构建上的 GitHu
  • 我可以编写一个 CSS 选择器来选择不具有特定类或属性的元素吗?

    我想编写一个 CSS 选择器规则来选择所有元素don t有一定的班级 例如 给定以下 HTML h1 class printable Example h1
  • React-Native:哪种自动化 CI 工具最好? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 React Native 社区 你们使用什么 CI 工具 我们的团队构建了一个react native ios应用程序 我们还有一个单独的测试团
  • 恢复发送至自部署合约的BNB

    我正在尝试创建 BOT 因此在 BSC 中从 eatamask 创建并部署了一个合约 我向该合约发送了一些 BNB 来检查 但没有成功 我怎样才能拿回BNB 感谢帮助 因为我对此很陌生 除非您在合约中具有允许您提取资金的自定义功能 否则它们
  • 如果 URL 是 https,Python urllib2 会给出“网络无法访问错误”

    我正在尝试使用 urllib2 库获取一些网址 a urllib2 urlopen http www google com ret a read 上面的代码工作正常 并给出了预期的结果 但是当我创建 url https 时 它会给出 网络无
  • 将文本插入活动迷你缓冲区

    我试图在运行外部命令后将文本插入到迷你缓冲区中 例如 call interactively eval expression insert blah 当然 问题是 eval expression 在用户输入之前不会返回 我的最终目标是添加一些
  • Xcode 6:项目导航器中没有 Frameworks 文件夹

    我正在使用 Xcode 6 并遵循 Xcode 版本 4 教程 因此这里和那里的情况有所不同 我的项目导航器中似乎没有 Frameworks 文件夹 因此当我下载一些 framework 文件并在项目编辑器的构建阶段手动添加它们时 我没有
  • HttpUtility.UrlEncoded URL 段的错误请求 400

    因此 如果我的应用程序 MVC url 中存在 url 编码段 则 IIS 会抛出 BAD REQUEST 400 e g http u lasoo com au Offer http u lasoo com au Offer 9289 7
  • json 从遗留属性名称反序列化

    如何设置 Newtonsoft Json 使用旧成员名称反序列化对象 但使用当前成员名称序列化它 编辑 要求是从正在序列化 反序列化的类中删除过时的成员 这是一个需要序列化和反序列化的示例对象 我给了一个属性一个属性 其中包含它过去可能已序
  • 将字典转换为方阵

    我想学习如何将字典转换为方阵 根据我所读到的内容 我可能需要将其转换为 numpy 数组 然后重新调整它的形状 我不想使用 reshape 因为我希望能够根据用户输入的信息来执行此操作 换句话说 我希望代码能够给出一个方阵 无论用户输入了多
  • 必须重新验证此请求的标头错误吗?

    我注意到 Chrome 缓存了一个视频文件 我用服务器上的另一个替换了它 chrome 继续从缓存中提供旧的 使用 JW flash 播放器 5 请求的标头如下所示 joe joe desktop wget O S spider http
  • 为什么这个 MySQL 查询的结果会相互相乘?

    SELECT user id SUM COALESCE point points 0 AS total points SUM CASE WHEN point date gt this month THEN point points ELSE