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

Requêtes MySQL Discussion :

génération de series - jointure sur même table


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5
    Par défaut génération de series - jointure sur même table
    soit une table (minisnmp) :
    id, NomMachine,Horaire, TypeReleve,Nomcapteur,ValeurCapteur

    select count(Horaire), Nomcapteur from data where NomMachine='morpheus' group by Nomcapteur me retourne ceci :

    | count(Horaire) | Nomcapteur |
    +----------------+------------+
    | 164 | /dev/sda |
    | 100 | /dev/sdb |
    | 179 | fan1 |
    | 59 | fan2 |
    | 59 | temp1 |
    | 59 | temp2 |

    je voudrais une requete qui me renvoi les 179 horaires (max(count(Horaire)) avec chaques NomCapteur (si pas de valeur retour = null )
    je me bat avec un left join, mais j'arrive pas à synthétiser ma requete dans ma tête pour la réussir

    pour info j'en suis là :
    select data1.Horaire, coalesce(data2.Nomcapteur,'vide'),coalesce(data2.ValeurCapteur,'vide') from data data1

    right outer join data data2 on (data1.Horaire=data2.Horaire)

    group by data1.Horaire order by data1.Horaire;

    et forcement 199enregistrement : ça correspond a rien d'intéressant

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5
    Par défaut
    Ma question est-elle mal formulée ?

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Salut,

    Personellement j'ai du mal à comprendre cette phrase :
    Citation Envoyé par gbulot Voir le message
    je voudrais une requete qui me renvoi les 179 horaires (max(count(Horaire)) avec chaques NomCapteur (si pas de valeur retour = null )
    Peux tu fournir un exemple du résultat que tu souhaites obtenir, et idéalement, avec un jeu de test des données en entrée.

    @+

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Salut,

    Personellement j'ai du mal à comprendre cette phrase :

    Peux tu fournir un exemple du résultat que tu souhaites obtenir, et idéalement, avec un jeu de test des données en entrée.

    @+
    ok je vais essayer :
    les champs :Horaire, NomMachine, TypeReleve,Nomcapteur,ValeurCapteur
    supposons le relevé à 10h00 et 11h00 le 25 août 2008

    ici tous les champs attendu sont présents :
    200808251000 morpheus fan fan1 2200
    200808251000 morpheus fan fan2 2300
    200808251000 morpheus temp cpu 52
    200808251000 morpheus temp mb 40

    ici il manque la température du cpu :
    200808251100 morpheus fan fan1 2200
    200808251100 morpheus fan fan2 2300
    200808251100 morpheus temp mb 40

    je voudrais que ma requête me retourne quelques chose comme cela (avant dernière ligne le NULL):
    200808251000 morpheus fan fan1 2200
    200808251000 morpheus fan fan2 2300
    200808251000 morpheus temp cpu 52
    200808251000 morpheus temp mb 40
    200808251100 morpheus fan fan1 2200
    200808251100 morpheus fan fan2 2300
    200808251100 morpheus temp cpu NULL
    200808251100 morpheus temp mb 40

    est-ce mieux formulé ?

    Merci de m'avoir répondu

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Citation Envoyé par gbulot Voir le message
    est-ce mieux formulé ?
    Oui c'est plus clair maintenant, mais c'est pas facile...
    J'ai pas mal galéré avec les jointures externes, mais j'ai rien réussi à faire avec, alors, je me suis rabattu sur une UNION. Si j'ai bien compris, l'idée est que tu veux toutes les lignes de ta table, plus des infos innexistantes pour certains horraires.
    Donc avec UNION on va essayer de rajouter des lignes supplémentaires créées artificiellement par le biais d'un produit cartésien,
    et ne conserver que des lignes innexistantes dans la table d'origine, à l'aide de la clause NOT EXISTS.

    Attention c'est pas jojo , et j'espère que tu pourras quand même l'adapter à tes données réelles.

    Donc la requête serait quelque chose du genre, avec un UNION ALL car normalement la 2ème requête ne renvoie que des données n'existant pas dans la première, mais test aussi avec un UNION (pour faire un DISTINCT) histoire d'être bien sûr :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    select horaire, nommachine, TypeReleve, Nomcapteur, ValeurCapteur
    from minisnmp
    where NomMachine='morpheus'
    UNION ALL
    select m.horaire, m.nommachine, t.TypeReleve,t.Nomcapteur, NULL as ValeurCapteur
    from minisnmp m
    JOIN (select distinct TypeReleve,Nomcapteur from minisnmp) t
    where m.NomMachine='morpheus'
    and m.typereleve=t.typereleve
    and not exists (select 1 from minisnmp m2 
    				where m2.Horaire=m.Horaire
    				and m2.nommachine=m.nommachine
    				and m2.TypeReleve=t.TypeReleve
    				and m2.nomcapteur=t.nomcapteur)
    order by Horaire
    Et le jeu de tests :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    -- 
    -- Structure de la table `minisnmp`
    -- 
     
    CREATE TABLE IF NOT EXISTS `minisnmp` (
      `Horaire` datetime default NULL,
      `NomMachine` varchar(20) default NULL,
      `TypeReleve` varchar(10) default NULL,
      `Nomcapteur` varchar(10) default NULL,
      `ValeurCapteur` int(11) default NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
     
    -- 
    -- Contenu de la table `minisnmp`
    -- 
     
    INSERT INTO `minisnmp` (`Horaire`, `NomMachine`, `TypeReleve`, `Nomcapteur`, `ValeurCapteur`) VALUES 
    ('2008-08-25 10:00:00', 'morpheus', 'fan', 'fan1', 2200),
    ('2008-08-25 10:00:00', 'morpheus', 'fan', 'fan2', 2300),
    ('2008-08-25 10:00:00', 'morpheus', 'temp', 'cpu', 52),
    ('2008-08-25 10:00:00', 'morpheus', 'temp', 'mb', 40),
    ('2008-08-25 11:00:00', 'morpheus', 'fan', 'fan1', 2200),
    ('2008-08-25 11:00:00', 'morpheus', 'fan', 'fan2', 2300),
    ('2008-08-25 11:00:00', 'morpheus', 'temp', 'mb', 40);
     
     
    mysql> select * from minisnmp;
    +---------------------+------------+------------+------------+---------------+
    | Horaire             | NomMachine | TypeReleve | Nomcapteur | ValeurCapteur |
    +---------------------+------------+------------+------------+---------------+
    | 2008-08-25 10:00:00 | morpheus   | fan        | fan1       |          2200 | 
    | 2008-08-25 10:00:00 | morpheus   | fan        | fan2       |          2300 | 
    | 2008-08-25 10:00:00 | morpheus   | temp       | cpu        |            52 | 
    | 2008-08-25 10:00:00 | morpheus   | temp       | mb         |            40 | 
    | 2008-08-25 11:00:00 | morpheus   | fan        | fan1       |          2200 | 
    | 2008-08-25 11:00:00 | morpheus   | fan        | fan2       |          2300 | 
    | 2008-08-25 11:00:00 | morpheus   | temp       | mb         |            40 | 
    +---------------------+------------+------------+------------+---------------+
    7 rows in set (0.00 sec)
     
    mysql> select horaire, nommachine, TypeReleve, Nomcapteur, ValeurCapteur
        -> from minisnmp
        -> where NomMachine='morpheus'
        -> union all
        -> select m.horaire, m.nommachine, t.TypeReleve,t.Nomcapteur, NULL as ValeurCapteur
        -> from minisnmp m
        -> join (select distinct TypeReleve,Nomcapteur from minisnmp) t
        -> where m.NomMachine='morpheus'
        -> and m.typereleve=t.typereleve
        -> and not exists (select 1 from minisnmp m2 
        -> where m2.Horaire=m.Horaire
        -> and m2.nommachine=m.nommachine
        -> and m2.TypeReleve=t.TypeReleve
        -> and m2.nomcapteur=t.nomcapteur)
        -> order by Horaire;
    +---------------------+------------+------------+------------+---------------+
    | horaire             | nommachine | TypeReleve | Nomcapteur | ValeurCapteur |
    +---------------------+------------+------------+------------+---------------+
    | 2008-08-25 10:00:00 | morpheus   | fan        | fan1       |          2200 | 
    | 2008-08-25 10:00:00 | morpheus   | fan        | fan2       |          2300 | 
    | 2008-08-25 10:00:00 | morpheus   | temp       | cpu        |            52 | 
    | 2008-08-25 10:00:00 | morpheus   | temp       | mb         |            40 | 
    | 2008-08-25 11:00:00 | morpheus   | fan        | fan1       |          2200 | 
    | 2008-08-25 11:00:00 | morpheus   | fan        | fan2       |          2300 | 
    | 2008-08-25 11:00:00 | morpheus   | temp       | mb         |            40 | 
    | 2008-08-25 11:00:00 | morpheus   | temp       | cpu        |          NULL | 
    +---------------------+------------+------------+------------+---------------+
    8 rows in set (0.00 sec)
    Bon j'espère que ça pourra t'aider, même si ça ne me paraît pas très propre.
    En tous cas ça m'a permis de passer ma déception suite au GP de F1

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5
    Par défaut [résolu]génération de series - jointure sur même table
    Citation Envoyé par skuatamad Voir le message
    Oui c'est plus clair maintenant, mais c'est pas facile...
    [... des explications très détaillées ...]
    Bon j'espère que ça pourra t'aider, même si ça ne me paraît pas très propre.
    En tous cas ça m'a permis de passer ma déception suite au GP de F1
    visiblement c'était une grosse déception en belgique, vu le détail des explications !
    je sais pas si ta machine server est véloce, mais 0s (y'a pas les 10ièmes ) surtout pour la 2ieme même s'il doit exister une optimisation cela répond à ma question !

    super merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/12/2009, 14h33
  2. Jointure sur 3 tables
    Par tonymontana4192 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 21/11/2005, 13h24
  3. [MySQL] Jointure sur une table déjà jointe
    Par genova dans le forum Requêtes
    Réponses: 3
    Dernier message: 18/10/2005, 23h54
  4. jointure sur TROIS tables
    Par caribou_belle dans le forum Langage SQL
    Réponses: 8
    Dernier message: 01/03/2004, 11h20
  5. Jointure sur 2 tables de bases différentes
    Par Celina dans le forum Langage SQL
    Réponses: 10
    Dernier message: 10/11/2003, 11h56

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