使用 MySQL 通过 JOIN 获取 GROUP BY 中的 SUM

2024-03-09

我在 MySQL 5.1.38 中有两个表。

products
+----+------------+-------+------------+
| id | name       | price | department |
+----+------------+-------+------------+
|  1 | Fire Truck | 15.00 | Toys       |
|  2 | Bike       | 75.00 | Toys       |
|  3 | T-Shirt    | 18.00 | Clothes    |
|  4 | Skirt      | 18.00 | Clothes    |
|  5 | Pants      | 22.00 | Clothes    |
+----+------------+-------+------------+

ratings
+------------+--------+
| product_id | rating |
+------------+--------+
|          1 |      5 |
|          2 |      5 |
|          2 |      3 |
|          2 |      5 |
|          3 |      5 |
|          4 |      5 |
|          5 |      4 |
+------------+--------+

我的目标是获得每个部门中具有 5 星级评级的所有产品的总价格。像这样的东西。

+------------+-------------+
| department | total_price |
+------------+-------------+
| Clothes    | 36.00       |  /* T-Shirt and Skirt */
| Toys       | 90.00       |  /* Fire Truck and Bike */
+------------+-------------+

如果可以的话,我想在没有子查询的情况下执行此操作。起初我尝试使用 sum() 进行连接。

select department, sum(price) from products
join ratings on product_id=products.id
where rating=5 group by department;
+------------+------------+
| department | sum(price) |
+------------+------------+
| Clothes    |      36.00 |
| Toys       |     165.00 |
+------------+------------+

正如您所看到的,玩具部门的价格不正确,因为自行车有两个 5 星级评级,因此由于加入而将该价格计算两次。

然后我尝试将不同的值添加到总和中。

select department, sum(distinct price) from products
join ratings on product_id=products.id where rating=5
group by department;
+------------+---------------------+
| department | sum(distinct price) |
+------------+---------------------+
| Clothes    |               18.00 |
| Toys       |               90.00 |
+------------+---------------------+

但随后服装部门就关闭了,因为两种产品的价格相同。

目前,我的解决方法包括获取产品的独特之处(id)并使用它来使价格独特。

select department, sum(distinct price + id * 100000) - sum(id * 100000) as total_price
from products join ratings on product_id=products.id
where rating=5 group by department;
+------------+-------------+
| department | total_price |
+------------+-------------+
| Clothes    |       36.00 |
| Toys       |       90.00 |
+------------+-------------+

但这感觉像是一个愚蠢的黑客行为。有没有更好的方法在没有子查询的情况下做到这一点?谢谢!


Use:

  SELECT p.department,
         SUM(p.price) AS total_price
    FROM PRODUCTS p
    JOIN (SELECT DISTINCT 
                 r.product_id,
                 r.rating
            FROM RATINGS r) x ON x.product_id = p.id
                             AND x.rating = 5
GROUP BY p.department

从技术上讲,这不使用子查询 - 它使用派生表/内联视图。

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

使用 MySQL 通过 JOIN 获取 GROUP BY 中的 SUM 的相关文章

随机推荐

  • 实时通知未发送

    我试图在 ASP NET Boilerplate 中显示实时通知 但未发送 public override async Task
  • NumPy 结构化数组的真正递归“tolist()”

    据我了解 将 NumPy 数组转换为本机 Python 列表的推荐方法是使用ndarray tolist http docs scipy org doc numpy reference generated numpy ndarray tol
  • 有没有一个工具可以对 PLSQL 进行负载测试

    我知道 utplsql 用于单元测试 有没有办法可以在循环中使用它来加载测试我的存储过程 我不想使用 JMeter 或通过任何 JDBC 驱动程序 只是想分析普通存储过程的性能 我认为单元测试工具不是正确的方法 因为您并没有真正对功能做出断
  • 你如何向新程序员解释面向对象? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我的亲戚正在学习编程 并且很难理解课程 例如 他很难理解您需要实例化它 方法无法访问其他方法中的变量 如果您更改类的一个实例中的变量 则它
  • 使用 sed 更改文件中的字符串?

    我有一个带有模板的输入文件 如下所示 我想更改版本 使用 sed Package somename Priority extra Section checkinstall Maintainer email protected cdn cgi
  • 如何在 Perl 中使用 HTTP::Async 一次发出 25 个请求?

    我正在执行大量 HTTP 请求 并选择 HTTP Async 来完成这项工作 我要发出超过 1000 个请求 如果我只是执行以下操作 请参阅下面的代码 许多请求在处理时就会超时 因为处理到达它们之前可能需要数十分钟 for my url u
  • 报告查看器控件不显示来自 SSRS 的报告

    我在 VS 2013 中使用 MS Report Viewer 10 该项目正在从 VS 2010 升级 我已经解决了一系列与报表查看器相关的问题 并让控件本身启动并运行 我在 SSRS 中有很多报告 并且我已经确认这些报告本身可以正常工作
  • View.playSoundEffect 有问题吗?

    我正在尝试播放声音效果 使用View playSoundEffec 方法 当按钮获得焦点时 问题是除非启用目标手机的声音选择 否则效果将永远不会播放 它可以从以下位置启用 Settings gt Sounds display gt Audi
  • PHP 将 Excel 导入数据库(xls 和 xlsx)

    我尝试搜索一些插件将Excel文件导入MySQL数据库 其中之一是http code google com p php excel reader http code google com p php excel reader 该工具非常强大
  • 如何使用rails运行简单的MYSQL查询

    我想使用 Rails 运行一个简单的 MYSQL 查询 Select movie title movie director from moving order by rating desc limit 5 我不想要创建模型的所有开销 我只想
  • 元组 (a,b)=(b,a) 中的成员交换在内部如何工作?

    In 55 a 5 In 56 b 6 In 57 a b b a In 58 a Out 58 6 In 59 b Out 59 5 a 和 b 的值交换在内部是如何工作的 它绝对不使用临时变量 Python 将右侧表达式与左侧赋值分开
  • android-studio的sdk管理器中没有LLDB

    I am using android studio 3 6 3 in my Manjaro Linux I am trying to run c in android studio for that i need LLDB I reinst
  • ReactJS错误编译失败'define'未定义

    我尝试编译的应用程序未使用外部 jquery 及其关联的 JS 文件进行编译 当我尝试将这些文件链接到 ReactJS 应用程序中的 HTML 页面时 它会抛出以下错误 错误是 define 未定义 no undef 此错误来自 jquer
  • 改造,回调 204 无内容响应?

    在 Android 上 我最初实现了一个像这样的 Retrofit 界面 DELETE USER API BASE URL id public void deleteUser Path id String id Callback
  • 当同级项具有不同宽度时将 Flex 项居中[重复]

    这个问题在这里已经有答案了 我知道 Flexbox 为居中项目提供了一个很好的解决方案 但是当我有 3 个项目并且我希望中心 第二个 项目相对于窗口居中时 我遇到了一个问题 而不管其他 2 个项目的大小 在我的笔中 您可以看到第二项 客户索
  • eclipse neon - 忽略 json 错误

    我的项目中只有很少的 JSON 并将它们导入 Eclipse 后Neon我在文件 和项目 上看到红色标记 抱怨 JSON 问题 我的问题是如何禁用 跳过 忽略 Eclipse Neon 中的 JSON 错误 您可以在下面配置 JSON 验证
  • jquery 文档内部或外部的函数就绪

    到目前为止 我只是将所有 jQuery 优点都放在了 document ready 函数 包括某些用户交互中使用的简单函数 但是不需要加载 DOM 文档或仅在之后调用的函数可以放置在 document ready 以及 例如 考虑一个非常简
  • 在 Python 中使用 try- except-else 是一个好习惯吗?

    在 Python 中 我时常会看到这样的块 try try this whatever except SomeException as exception Handle exception else return something try
  • JPMS ServiceLoader 没有按预期为我工作

    JPMS服务加载器不符合我的预期 我正在尝试提供一个作为可执行 jar 的桌面程序使用默认服务 单个用户可能会超载 用户提供自己的服务类 并在命令行上将其名称作为参数给出 The service package eu ngong mySer
  • 使用 MySQL 通过 JOIN 获取 GROUP BY 中的 SUM

    我在 MySQL 5 1 38 中有两个表 products id name price department 1 Fire Truck 15 00 Toys 2 Bike 75 00 Toys 3 T Shirt 18 00 Clothe