2011-03-10 60 views
0

我有一個表中有512個條目(最初,​​這將增加我們添加到它的記錄)。這個表有列:MYSQL組在一起查詢

  • idid被auto_incrementing和初級)
  • ip_address
  • in_usein_use是布爾,真/假)

基本上我有地址的列表中的這個(就像我剛纔說的那樣得到了512)

我需要問一下mysql返回ro ws沒有使用,但將它們組合在一起(即我需要11個空閒地址),

但是,此係統將在in_use列上標記爲false的行與其他列中的行標記爲true,並將其標記爲true。

我需要一種方法來抓住ID被順次斷裂IP的設置量...例如

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爲1到12的跳過9的列表,這對我正在嘗試做的事不起作用:(

我想要做的事情是意識到9在使用中,所以不能使用它,因此不能使一個連續組和從11到22挑...因爲這是下一個可用的連續組。有沒有什麼辦法可以爲此查詢結構?討論

回答

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); 

以下查詢會給你的所有可能的序列的開始和結束,以滿足範圍大小所需(其中在最後條款);

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; 
+0

+1:確認,作品在5.1.49 – 2011-03-10 02:38:33

+0

我會給它一個鏡頭! – 2011-03-10 08:06:20