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

az31mfrm  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(310)

我的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

izj3ouym

izj3ouym1#

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

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;

这个查询实际上会查找表中没有行的所有allnumber行(因为where中的is null)。。。但由于使用了聚合函数(min),它包含了一个虚拟的“groupby”,只得到一个结果行。

相关问题