# zrangebyscore

### 1. 基本語法

#### zrangebyscor&#x65;**(`key`, `min:<number|string>`, `max:<number|string>`,** `['WITHSCORES']`**, `['LIMIT', offset, count]`,  `callback`)**&#x20;

於有序集合中，篩選分數範圍介&#x5728;**`min`**&#x8207;**`max`**&#x4E4B;間的成員，根據分數「由小到大」回傳成員名單(這點與[**zrevrangebyscore**](#1.-ji-ben-yu-fa)相反)。可再透&#x904E;**`WITHSCORES`**&#x53C3;數同時回傳成員及分數；或根&#x64DA;**`LIMIT`**&#x53C3;數，透過偏移位&#x7F6E;**`offset`**&#x8207;數&#x91CF;**`count`**&#x7BE9;選區間成員。

| 特殊字串       | 適用參數        | 功能                                                |
| ---------- | ----------- | ------------------------------------------------- |
| -Inf       | `min`       | 對應分數為負無限小                                         |
| Inf 或 +inf | `max`       | 對應分數為正無限大                                         |
| (          | `min`、`max` | <p>預設分數區間包含邊界值(閉集合)；<br>加「 ( 」則區間將不包含邊界值(開集合)</p> |

### **2. 範例**

**(1) 創建一組分數不完全相同的有序集合**

{% tabs %}
{% tab title="TypeScript" %}
```typescript
client.del('zset:1');

const key1 = 'zset:1'
const members1 = ['c', 'a', 'C', 'A', 'B', 'b'];
const scores1 = [-2, -1, 0, 0, 1, 2];

members1.forEach((mem, ind) => {
    client.zadd(key1, scores1[ind], mem);
})

client.zrange(key1, 0, -1, 'WITHSCORES', (err, obj) =>{
    console.log(key1, ':', obj);
});
```
{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="Output-TS" %}
```
zset:1 : ['c', '-2', 'a', '-1', 'A', '0', 'C', '0', 'B', '1', 'b', '2']
```
{% endtab %}
{% endtabs %}

**(2) 篩選分數範圍：分數大於等於0以上的所有成員**

{% hint style="info" %}
**不需要知道成員分數的最大值/最小值，可直接透過-inf/+inf特殊字串替代。**
{% endhint %}

{% tabs %}
{% tab title="TypeScript" %}
```typescript
client.zrangebyscore(key1, 0, 'inf', (err, obj) =>{
    console.log(key1, ':', obj);
});
```
{% endtab %}
{% endtabs %}

| 成員 | c  | a  | A     | C     | B     | b     |
| -- | -- | -- | ----- | ----- | ----- | ----- |
| 分數 | -2 | -1 | **0** | **0** | **1** | **2** |

{% tabs %}
{% tab title="Output-TS" %}
```
zset:1 : [ 'A', 'C', 'B', 'b' ]
```
{% endtab %}
{% endtabs %}

**(3) 透過LIMIT參數進一步擷取區間成員:**&#x20;

{% tabs %}
{% tab title="TypeScript" %}
```typescript
client.zrangebyscore(key1, '(-1', '2', 'LIMIT', 1, 2, (err, obj) =>{
    console.log(key1, ':', obj);
});
```
{% endtab %}
{% endtabs %}

| 成員         | c  | a  | A     | C     | B     | b     |
| ---------- | -- | -- | ----- | ----- | ----- | ----- |
| 分數         | -2 | -1 | 0     | 0     | 1     | 2     |
| (-1, 2]    | x  | x  | **o** | **o** | **o** | **o** |
| offset = 1 | x  | x  | 0     | **1** | **2** | **3** |
| count = 2  | x  | x  | -     | **o** | **o** | -     |

{% tabs %}
{% tab title="Output-TS" %}
```
zset:1 : [ 'C', 'B' ]
```
{% endtab %}
{% endtabs %}
