【发布时间】:2022-08-22 01:44:28
【问题描述】:
我有一个具有不同3-3-4 的存储桶,我需要为该号码找到正确的存储桶
1-3 4-6 7-10 11-13 14-16 17-20 21 - 23 24 - 26 27 - 30
找到正确存储桶的有效公式可能是什么,例如 5 号位于存储桶 4-6 中,18 位于存储桶 17-20 中。
需要为此编写sql查询
-
数字有多大(例如您的示例中的 1..30)?如果不是太大,请预先填充查找表。
我有一个具有不同3-3-4 的存储桶,我需要为该号码找到正确的存储桶
1-3 4-6 7-10 11-13 14-16 17-20 21 - 23 24 - 26 27 - 30
找到正确存储桶的有效公式可能是什么,例如 5 号位于存储桶 4-6 中,18 位于存储桶 17-20 中。
需要为此编写sql查询
我会维护一个包含范围值的单独真实表。然后,加入它以获得您想要的输出。
Table: ranges
start | end
1 | 3
4 | 6
7 | 10
11 | 13
14 | 16
17 | 20
21 | 23
24 | 26
27 | 30
WITH buckets AS (
SELECT 5 AS val UNION ALL
SELECT 18
)
SELECT b.val, CAST(r.start AS VARCHAR(10)) + '-' + CAST(r.end AS VARCHAR(10))
FROM buckets b
INNER JOIN ranges r
ON b.val BETWEEN r.start AND r.end
ORDER BY b.val;
【讨论】:
对于不重叠的范围,您只需要每个范围的起始值(或等效地,结束)。然后索引该列。那么这是非常有效的:
SELECT ...
FROM ...
WHERE n >= ?
ORDER BY n
LIMIT 1
由于 INDEX,这在 O(1) 中运行。 (或者 O(logN) 如果包括 BTree 查找的成本。)
更多详细信息(以 IP 地址表示):http://mysql.rjweb.org/doc.php/ipranges
【讨论】: