我的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
答案 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”只获得一个结果行。