我有一个包含512个条目的表(最初,这会随着我们添加的记录而增加)。此表包含列:
id
(id
是auto_incrementing和primary)ip_address
in_use
(in_use
是bool,true / false)基本上我有一个地址列表(就像我最初说的那样,它有512个)
我需要让mysql返回未使用的行,但是将它们组合在一起(即我需要11个空闲地址),
但是,此系统的in_use
col旁边的行标记为false,其他行旁边为true。
我需要一种方法来获取一定数量的IP,这个ID被顺序打破......例如
ids => in_use
--------------
1 => false
2 => false
3 => false
4 => false
5 => false
6 => false
7 => false
8 => false
9 => true
10 => true
11 => false
12 => false
13 => false
14 => false
15 => false
16 => false
17 => false
18 => false
19 => false
20 => false
21 => false
22 => false
23 => false
现在,如果我查询最接近顶部的11个免费地址,它将带回id跳过9的id 1到12的列表,这对我想做的事情不起作用:(
我希望它能够意识到9正在使用中,因此无法使用它,因此无法创建一个顺序组并从11到22中选择...因为这是下一个可用的顺序集。
有没有办法为此构建查询?
答案 0 :(得分:1)
供讨论的样本表
#drop table if exists ids;
create table ids (id int primary key, in_use bool);
insert ids values
(1,0),
(2,0),
(3,0),
(4,0),
(5,0),
(6,0),
(7,0),
(8,0),
(9,1),
(10,1),
(11,0),
(12,0),
(13,0),
(14,0),
(15,0),
(16,0),
(17,0),
(18,0),
(19,0),
(20,0),
(21,0),
(22,0),
(23,0);
以下查询将为您提供所有可能的序列开始和结束,以满足所需的范围大小(最后的where子句);
select seq_start, id seq_end
from
(
select
id,
@start:=IF(in_use,null,IFNULL(@start,id)) seq_start,
@rownum:=IF(@start is null, 0, @rownum+1) rownum
from (select @start:=0, @rownum:=0) s
cross join ids
order by id
) numbered
where rownum = 11;