Requêtes SQL "simples" sur 3 tables

Requêtes SQL "simples" sur 3 tables - SQL/NoSQL - Programmation

Marsh Posté le 08-05-2013 à 15:37:58    

Bonjour à tous, voici mon problème :
 
J'ai 1 base de données avec 3 tables :
 
Une table adressip:
 
ID (PK) || IP || Rem || type
 
Avec IP un entier (c'est l'adresse IP convertie en décimal en fait), Rem un varchar contenant le nom de la machine et type un enum (Server, router, etc) pour le type de machine.
 
Une table ipping:
 
ID (PK) || IP || Ping
 
Avec Ping qui ne peut valoir que 1 ou 2 suivant si l'adresse répond au ping ou pas.
 
Une table ipnet:
 
ID (PK) || IP || Cidr || netend || Segment
 
Avec Cidr (varchar) l'écriture CIDR d'un réseau, netend (varchar) l'adresse de Broadcast (la dernière adresse décrivant le réseau) et Segment (enum) un endroit à spécifier par l'utilisateur.
 
 
Il y a 3 recherches que je voudrais faire :
 
Premièrement : Rechercher le nombre d'appareils différents par type, c'est à dire combien de Server, switch, etc DISTINCTS il y a dans ma table adressip (car par exemple un serveur peut recevoir plusieurs adresses IP mais ca ne reste qu'un seul et unique serveur).
 
J'ai écrit ceci :  

Code :
  1. SELECT `type` , COUNT( type ) AS Nombre FROM
  2.                 (SELECT `type` FROM `adressip` AS T1 GROUP BY `rem`) AS T2
  3. GROUP BY `type` ORDER BY `Nombre` DESC


 
Et ca me donne :
type          Nombre
Server  17739
Switch  9545
Firewall  3099
 
Mon problème avec cette première requête c'est que si j'écris ca :  

Code :
  1. SELECT DISTINCT `rem` FROM `adresip` WHERE `typ` LIKE "Server"


 
La requête me renvoie 17901 résultats et non pas 17739 comme la première requête. Quel est le problème ici, quel nombre dois-je croire?
 
Ce qui est étonnant c'est que

Code :
  1. SELECT DISTINCT `rem` FROM `adressip`

renvoie exactement la même chose que

Code :
  1. SELECT `type` FROM `adressip` AS T1 GROUP BY `rem`


 
 
2ème chose :
 
Dans ma table ipping je vois quelles sont les adresses ip qui ne répondent pas au PING, dans ce cas, ping=2, sinon ping =1. Ce que je voudrais faire, c'est coupler ma première recherche en ne prenant en compte que les adresses IP qui répondent au ping.
 
Je décompose :  
 

Code :
  1. SELECT ip FROM ipm_ping WHERE ping=1


 
Et ensuite pour récupérer le type des machines qui sont dans ma table adressip :
 

Code :
  1. SELECT `type` FROM adressip WHERE ip IN (SELECT ip FROM ipping WHERE ping=1)


 
Mais cette requête ne fonctionne tout simplement pas ! Elle dure infiniment et bloque même PHPMyadmin...
J'ai bien tenté autre chose mais ca ne marche pas non plus:
 

Code :
  1. SELECT `type` FROM adressip, ipping WHERE adressip.ip=ipping.ip and ipping.ping =1


 
Est-ce que vous voyez d'où peut bien provenir le problème?
 
 
La dernière :
 
Je voudrais savoir combien d'adresses IP il y a en moyenne par appareil.
C'est à dire que je voudrais avoir un résultat comme ceci :
 
type          IP/Appareil
Server  10
Switch  6
Firewall  4
 
Mais la je bloque, j'arrive pas à écrire ma requête...
 
Merci d'avance à tous pour votre aide.


Message édité par dafidu le 10-05-2013 à 10:20:39
Reply

Marsh Posté le 08-05-2013 à 15:37:58   

Reply

Marsh Posté le 08-05-2013 à 18:49:24    

Apprends le SQL, notamment la partie sur les jointures (ici, les équi-jointures (INNER JOIN) ;)...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 10-05-2013 à 10:06:14    

Primo, on ne sait pas ce qu'est "ipaddrs"
 
Deuzio, on ne fait pas de group by sans fonction d'agrégation.
 
Pour ton pb #1, je dirais tout simplement :
 
Select Count(ID), type from adresseip group by type
 
tu comptes le nombre d'équipements (ID) par type. Tout simplement...
 
 

Reply

Marsh Posté le 10-05-2013 à 10:35:17    

toji a écrit :


Select Count(ID), type from adresseip group by type


 
Merci de ta réponse mais le problème c'est que je voudrais le nombre d'équipement distinct. Par exemple dans la table adressip il peut y avoir un même serveur avec 10 adresses IP différentes donc 10 entrées avec 10 ID différentes mais un même Rem et Type. Et je voudrais le compter qu'une seule fois.


Message édité par dafidu le 10-05-2013 à 10:35:40
Reply

Marsh Posté le 10-05-2013 à 17:04:46    

J'avais pas compris que l'équipement c'était rem :
 
Select Count(distinct rem), type from adresseip group by type  
 
Donc tu comptes les rem différents/distincts par type...

Reply

Marsh Posté le 13-05-2013 à 16:00:37    

Ok, merci, ca me donne bien le résultat !
 
Est-ce que tu aurais une piste pour mon 3eme problème?
 
Merci d'avance!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed