IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Requêtes "simples" sur 3 tables


Sujet :

Développement SQL Server

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Requêtes "simples" sur 3 tables
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT `type` , COUNT( type ) AS Nombre FROM 
                    (SELECT `type` FROM `adressip` AS T1 GROUP BY `rem`) AS T2 
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT `rem` FROM `adressip` 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT `rem` FROM `adressip`
    renvoie exactement la même chose que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Re-bonjour, je viens de tester pour mon deuxième problème ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ipaddrs LEFT JOIN (ipm_ping) ON (ipaddrs.ip = ipm_ping.ip) WHERE (ipm_ping.ping = 1)
    Cela fonctionne sauf que la requête dure plus d'une minute et bloque le cpu a 100%...
    Est-ce qu'il y aurait un moyen d'optimiser ceci?

    merci

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Citation Envoyé par davfidu Voir le message
    Re-bonjour, je viens de tester pour mon deuxième problème ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ipaddrs LEFT JOIN (ipm_ping) ON (ipaddrs.ip = ipm_ping.ip) WHERE (ipm_ping.ping = 1)
    Cela fonctionne sauf que la requête dure plus d'une minute et bloque le cpu a 100%...
    Est-ce qu'il y aurait un moyen d'optimiser ceci?

    merci
    Si vôtre requête fonctionne bel et bien dans 100% des cas, votre left join est inutile.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ipaddrs INNER JOIN (ipm_ping) ON (ipaddrs.ip = ipm_ping.ip) WHERE (ipm_ping.ping = 1)
    Et créez un index sur ipaddrs.ip ainsi que sur ipm_ping.ping
    Most Valued Pas mvp

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Bonjour, merci de ta réponse ! Mais je ne comprends pas très bien ce que tu veux dire par "si ma requête fonctionne, le LEFT JOIN est inutile".

    Je devrais le remplacer par le INNER JOIN que tu me proposes?

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Quand tu fais fait : WHERE (ipm_ping.ping = 1) cela implique que ipm_ping.ping est non null, donc forcément la jointure externe ne peut qu'avoir eu un matching.
    Du coup, autant écrire "inner join" sinon, "ipm_ping.ping = 1" devrait être placé dans la clause "ON" du left join.
    Most Valued Pas mvp

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Ah ok très bien !

    Est-ce que tu aurais une piste pour mon dernier problème (le 3eme)?

    Merci d'avance!

Discussions similaires

  1. Requête avec select max sur 3 tables
    Par Tintinduweb dans le forum Requêtes
    Réponses: 1
    Dernier message: 16/03/2010, 05h49
  2. Requête SQL avec jointure sur trois tables
    Par pit2121 dans le forum SQL
    Réponses: 0
    Dernier message: 19/05/2008, 20h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo