MYSQL Группировать запрос - PullRequest
0 голосов
/ 10 марта 2011

У меня есть таблица с 512 записями (изначально она будет увеличиваться при добавлении записей).В этой таблице есть столбцы:

  • id (id - автоинкрементный и основной)
  • ip_address
  • in_use (in_use - bool, true / false)

По сути, у меня есть список адресов в этом (как я уже говорил, он получил 512)

Мне нужно попросить mysql вернуть строки, которые не используются,но сгруппируйте их вместе по заданному номеру (то есть мне нужно 11 свободных адресов),

Однако в этой системе строки, помеченные как false, в столбце in_use рядом с другими значениями true.

Мне нужен способ получить определенное количество 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 свободных адресов, ближайших к началу, это вернет списокесли число от 1 до 12 пропускается через 9, это не сработает для того, что я пытаюсь сделать: (

Я хотел бы, чтобы я понял, что 9 используется, поэтому не может его использовать, поэтому не можетсоздайте последовательную группу и выберите от 11 до 22 ... так как это следующий доступный последовательный набор.

Есть ли способ структурировать запрос для этого?

1 Ответ

1 голос
/ 10 марта 2011

Пример таблицы для обсуждения

#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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...