2011-03-10 4 views
0

J'ai une table avec 512 entrées (initialement, cela va augmenter avec les enregistrements que nous y ajoutons). Ce tableau comporte des colonnes:MYSQL Groupe requête ensemble

  • id (id est auto_incrementing et primaire)
  • ip_address
  • in_use (in_use est bool, vrai/faux)

Fondamentalement, j'ai une liste d'adresses dans ceci (comme je l'ai dit initialement il a 512)

J'ai besoin de demander à mysql de retourner ro ws non utilisé, mais les regrouper par un nombre défini (ie j'ai besoin de 11 adresses libres),

Cependant, ce système aura des lignes marquées faux sur le in_use col juste à côté des autres avec vrai. il ramènera

je besoin d'un moyen de saisir une certaine quantité de l'identifiant de IP étant brisé de manière séquentielle ... exemple

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 

Maintenant, si je fais une recherche 11 adresses libres, plus proche du haut, la liste des ID de 1 à 12 en sautant 9, cela ne fonctionnera pas pour ce que je suis en train de faire :(

Ce que je voudrais faire est de se rendre compte que 9 est en cours d'utilisation ne peut donc pas utiliser, donc ne peut pas faire un groupe séquentiel et une sélection de 11 à 22 ... car il s'agit du prochain jeu séquentiel disponible

Existe-t-il un moyen de structurer une requête pour cela?

Répondre

1

Table d'échantillons pour la discussion

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

La requête suivante vous donnera tout le début de la séquence possible et se termine pour satisfaire la taille de la gamme requise (clause where à la fin);

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: Confirmé, fonctionne le 5.1.49 –

+0

Je vais tenter le coup! –