MySQL选择总和大于阈值的记录

标签 mysql

我需要根据 MySQL 数据库表中列出的文件大小选择记录,使用单个查询(无存储过程)。记录集应包含总文件大小等于或如果需要超过特定阈值的所有记录。 (例如,阈值 = 30,结果返回文件大小等于 10、10、20 或 10、10、10 的 3 条记录或文件大小为 32 的一条记录)

表格

+----+---------+-----------+
| id | user_id | fileSize  |
+----+---------+-----------+
|  1 |       1 |      9319 |
|  2 |       1 |     51683 |
|  3 |       1 |     19776 |
|  4 |       1 |    395890 |
|  5 |       1 |      7132 |
|  6 |       1 |     97656 |
|  7 |       1 |      9798 |
|  9 |       1 |     16096 |
| 10 |       1 |    113910 |
| 11 |       1 |    160037 |
+----+---------+-----------+

在研究并尝试了多种不同的解决方案之后,我提出的最佳查询如下所示:

SELECT f1.user_id, f1.id AS file_id, f1.fileSize, SUM(f2.fileSize) AS totalSum
FROM files AS f1 
INNER JOIN files AS f2 ON f1.id >= f2.id 
WHERE f1.user_id = 1
GROUP BY f1.id 
HAVING totalSum <= 350000;

示例结果

+---------+---------+-----------+----------+
| user_id | file_id |  fileSize | totalSum |
+---------+---------+-----------+----------+
|       1 |       1 |      9319 |     9319 |
|       1 |       2 |     51683 |    61002 |
|       1 |       3 |     19776 |    80778 |
+---------+---------+-----------+----------+

期望的结果

+---------+---------+-----------+----------+
| user_id | file_id |  fileSize | totalSum |
+---------+---------+-----------+----------+
|       1 |       1 |      9319 |     9319 |
|       1 |       2 |     51683 |    61002 |
|       1 |       3 |     19776 |    80778 |
|       1 |       4 |    395890 |   476668 |
+---------+---------+-----------+----------+

或者

+---------+---------+-----------+----------+
| user_id | file_id |  fileSize | totalSum |
+---------+---------+-----------+----------+
|       1 |       3 |    395890 |   395890 |
+---------+---------+-----------+----------+

上面的查询不起作用的是永远不会满足阈值,因为它基于 HAVING 小于阈值(大于只是返回远高于阈值的疯狂数量的记录)。此外,如果集合中有任何记录的文件大小超过阈值,查询结果有时会返回空。理想的结果会达到或略微超过阈值,如果单个文件大小达到或超过阈值,则可能包含许多记录或单个记录。

如有任何帮助,我们将不胜感激。我认为这是大约五年来我第一次在网上发布问题。说真的,坚持了一个星期。 ~谢谢

最佳答案

这似乎适合 UNION 结果集。因此,您必须获得 2 个查询(每个“条件”一个)并使用 union 连接它们的结果。

第一个查询将变为:

SELECT f1.user_id, f1.id AS file_id, SUM(f1.fileSize) AS totalSum
FROM files AS f1 
WHERE f1.user_id = 1
GROUP BY f1.id 
HAVING totalSum <= 350000;

现在你需要查询大小是否太大:

SELECT f1.user_id, f1.id AS file_id, MAX(f1.fileSize) AS max
FROM files AS f1 
WHERE f1.user_id = 1
GROUP BY f1.id 
HAVING max >= 350000;

接下来您要将它们合并到一个查询中。由于两者具有相同的字段,您可以简单地“合并”结果

SELECT f1.user_id, f1.id AS file_id, SUM(f1.fileSize) AS totalSum
FROM files AS f1 
WHERE f1.user_id = 1
GROUP BY f1.id 
HAVING totalSum <= 350000
UNION
SELECT f1.user_id, f1.id AS file_id, MAX(f1.fileSize) AS max
FROM files AS f1 
WHERE f1.user_id = 1
GROUP BY f1.id 
HAVING max >= 350000;

PS:您将“ON f1.id >= f2.id”作为连接条件,不确定为什么 > 会非常具体:)

关于MySQL选择总和大于阈值的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29154122/

相关文章:

mysql - 将行转换为mysql中的列

python - pymysql + 格式字符串的参数不足 + 列表

mysql - 使用子查询和唯一值插入

mysql - 如果不存在子集,则选择全部,否则选择子集

php - 我怎样才能使这个 SQL 查询最有效?

Mysql Replication-master-bin日志文件没有更新

php - 长文不更新

php - SQL 更改表与值

php - 将 MySQL 连接转换为 JSON 数组

mysql - 如何在 where 子句中使用 SOUNDS LIKE