我需要根据 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/