我在sql中有一个包含3列的表:BIGINT StartNumber, BIGINT EndNumber, BIGINT LocationId
,我需要能够做这样的事情
Select LocationId where StartNumber < @number and EndNumber > @number.
例如:
StartNumber EndNumber LocationId
1 5 1
6 9 1
10 16 2
当我有@number = 7时,我应该得到LocationId = 1
我怎样才能在redis中执行此操作?
我正在考虑将此表移至redis,使用有序集和ZRANGEBYSCORE
但它对我不起作用:
1)当我使用ZADD键得分成员[得分] [成员]时,即使使用nx参数,我也无法添加具有相同成员和不同得分的2个元素:
zadd myset nx 1 "17" 2 "17"
- 它将添加一个元素,然后更新其分数,而不是添加两个元素。
2)当我添加这个:zadd set1 2 "a" 4 "b" 6 "c" 10 "d"
然后尝试做zrangebyscore set1 3 3(想要获得其成绩包括3的成员)我得到空结果
P.S。所有命令都在redis网站的示例页面上执行。
答案 0 :(得分:2)
换句话说,您的问题是&#34;如何将N个数字范围映射到某个位置&#34;。一种方法是使用两个排序集,一个用于StartNumber
,另一个用于EndNumber
。由于成员必须是唯一的,我们还需要通过将Start / End值用作成员的一部分来确保。例如,使用您的示例数据,可以这样做:
ZADD StartNumber 1 "1:5:1" 6 "6:9:1" 10 "10:16:2"
ZADD EndNumber 5 "1:5:1" 9 "6:9:1" 16 "10:16:2"
要查找@ number = 7的位置,请执行ZRANGEBYSCORE StartNumber -inf 7
和ZRANGEBYSCORE EndNumber 7 +inf
并将结果相交。剩下的就是将冒号的结果拆分为冒号(:
)并使用第3个元素作为位置。
注意:如果您的应用确保没有重叠的范围,并且每个&#34;数字&#34;只能有一个位置,则只能使用一组来获得相同的结果