У меня есть таблица с 512 записями (изначально она будет увеличиваться с количеством записей при добавлении к ней). В этой таблице есть столбцы:
id
(id
является автоматически увеличивающимся и первичным)ip_address
in_use
(in_use
логическое значение, 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 ответ
Примерная таблица для обсуждения
#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;
Похожие вопросы
Новые вопросы
mysql
MySQL — это бесплатная система управления реляционными базами данных (RDBMS) с открытым исходным кодом, которая использует язык структурированных запросов (SQL). НЕ ИСПОЛЬЗУЙТЕ этот тег для других БД, таких как SQL Server, SQLite и т. д. Это разные БД, которые используют свои собственные диалекты SQL для управления данными.