J'ai stocké dans une base de données certains numéros de clients, l'adresse IP attribuée, le routerIP, le vlan et la zone
from | to | router | zone | vlan ----------------------------------------------------- 16090 | 16095 | 10.10.10.25 | 1 | 103 |
J'ai besoin de présenter les numéros de clients déjà utilisés regroupés par routeur , zone et vlan pour obtenir quelque chose comme ceci:
from | to | router | zone | vlan -------------------------------------------------------- 16090 | 16093 | 10.10.10.25 | 1 | 103 | 16095 | 16095 | 10.10.10.25 | 1 | 103 |
les numéros de client sont uniques, en ce moment Ma requête est quelque chose comme ceci:
SELECT
MIN( no ) AS start_no,
MAX( no ) AS end_no,
router,
idZone,
vlan
FROM
address
GROUP BY
router,
idZone,
vlan
3 Réponses :
Votre requête est correcte, mais il peut y avoir un espace vide dans l'un des champs du pivot, ce qui rend le regroupement difficile. Par exemple, l'une des colonnes pivot de la clause group by, disons que router pourrait être "10.10.10.25" ou "10.10.10.25". Essayez donc de couper les espaces.
SELECT
MIN( no ) AS `from`,
MAX( no ) AS `to`,
trim(router) router,
trim(idZone) zone,
trim(vlan) vlan
FROM
address
GROUP BY
trim(router),
trim(idZone),
trim(vlan);
La requête suivante devrait fonctionner pour tous les scénarios:
(SELECT
MIN( no ) AS start_no,
MAX( no ) AS end_no,
router,
idZone,
vlan
FROM
address a1
where exists (SELECT a2.no FROM address a2 WHERE a2.no = a1.no + 1) or
exists (SELECT a2.no FROM address a2 WHERE a2.no = a1.no - 1)
GROUP BY
router,
idZone,
vlan
)
union
(select no as_no, no as end_no, router,idzone,vlan
from address a1
where not exists (SELECT a2.no FROM address a2 WHERE a2.no = a1.no + 1) and
not exists (SELECT a2.no FROM address a2 WHERE a2.no = a1.no - 1)
GROUP BY
router,
idZone,
vlan
)
ORDER BY vlan
La partie de la requête avant union retournera tous les groupes qui ont un client no continu et l'autre partie de la requête renverra les autres groupes uniques.
Vous pouvez commencer ici:
SELECT no
, CASE WHEN no = @prev+1 THEN @i:=@i ELSE @i:=@i+1 END i
, @prev := no
FROM my_table
, (SELECT @prev:=null, @i:=0) vars
ORDER
BY no;
Ah, un problème de lacunes et d'îles assez standard
Quelle version de mysql utilisez-vous? Parce que si vous regardez ce db <> fiddle , vous verrez que votre requête renvoie les données exactes que vous vouliez
@IgorIlic Non, cela ne donne pas les données qu'il veut.