簡體   English   中英

MySQL選擇總和大於閾值的記錄

[英]MySQL select records with sum greater than threshold

我需要根據MySQL數據庫表中列出的文件大小來選擇記錄,並使用單個查詢(無存儲過程)。 記錄集應包含文件總和等於或必要時超過特定閾值的所有記錄。 (例如,閾值= 30,結果返回3條記錄,文件大小等於10、10、20或10、10、10或一條記錄,文件大小為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個查詢(每個“條件”一個),並使用並集加入其結果。

第一個查詢將變為:

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”作為連接標准,不確定為什么>會非常區分大小寫:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM