MySQL:查找范围内最小的未使用标签(数字)

时间:2018-01-08 14:34:11

标签: mysql sql

我的MySQL数据中有几个范围(例如100到200,201到350等) (行看起来像)

id (pk)    label (int)    name (string)

1          101            Row1
1          102            Row2
1          104            Row4
1          105            Row5
1          107            Row7

现在我想在一个范围内找到最低的未使用标签。 注意:这些标签不是键,只是整数字段中的标签号。 删除行时,对于具有新ID的新行,该标签应该再次可用。

在上面的示例中,它将是100。

id    label    name

1     100      Row1
1     101      Row1
1     102      Row2
1     104      Row4
1     105      Row5
1     107      Row7

在上面的例子中,它将是103

id    label    name

1     101      Row1
1     102      Row2
1     104      Row4
1     105      Row5
1     107      Row7

在上面的示例中,它将是100

但是查询

SELECT DISTINCT(t1.label + 1) AS number
FROM descriptions t1
WHERE NOT EXISTS(SELECT * FROM descriptions t2 WHERE t2.label = t1.label + 1) AND t1.label IS NOT NULL
AND t1.label >= 100 AND t1.label < 107
ORDER BY t1.label
LIMIT 1

它会给我103而不是100,我需要100

1 个答案:

答案 0 :(得分:1)

一种解决方案:首先要有一个包含所有值的表。 (只需要一列,然后为所有值插入行)

CREATE TABLE allnumbers (num MEDIUMINT UNSIGNED PRIMARY KEY);
INSERT INTO allnumbers VALUES ((100),(101),(102),(103),... (400)); 

然后可以在此

上进行左连接
SELECT MIN(a.num) FROM allnumbers a LEFT JOIN table t ON (num=label) 
  WHERE a.num BETWEEN 100 AND 200 AND t.label IS NULL;

这个查询实际上找到了所有全数行,DONT在表中有一行(因为其中的IS NULL)...但由于使用了聚合函数(MIN),它包含一个虚拟的“GROUP BY”只获得一个结果行。