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 :

Mixer deux requêtes


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Par défaut Mixer deux requêtes
    Bonjour à tous,

    J'ai besoin de l'aide d'experts SQL pour m'aider à mixer deux requêtes en une:


    La première requête sélectionne le plus vieux record pour chaque (numéro,ligne) distinct selon les champs (date/heure)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT *
    FROM comptage AS t 
    WHERE (((t.heure)=(SELECT Max(heure) 
    FROM Comptage AS cpt 
    WHERE (((cpt.date)=(SELECT MAX(date) 
    FROM Comptage 
    WHERE numero = cpt.numero AND ligne = cpt.ligne ))) 
    AND cpt.numero = t.numero AND cpt.ligne = t.ligne and cpt.date = t.date)))
    La seconde sélectionne tous les enregistrements de la table comptage selon qu'ils soient également existant dans la table lecture (basé sur les champs (numéro, ligne) et ayant la plus grande date.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT cpt.*
    WHERE lecture.client = cpt.numero AND lecture.ligne = cpt.ligne AND cpt.date_lecture = 
    (SELECT MAX(date) FROM comptage WHERE numero = cpt.numero AND ligne = cpt.ligne )
    Au final, je voudrais que pour chaque record de la table lecture, récupèré le record correspondant de la table comptage et pour lequel la date/heure est la plus grande.

    Pour expliquer le contexte, la table comptage contient un record par relevé (lecture d'un compteur électrique). Dans pour un même compteur (ligne / numéro) il y a plusieurs records correspondant à chaque lecture dans le temps. Le but est de retrouvé la plus ancienne lecture.

    Merci d'avance pour vos propositions.

  2. #2
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Par défaut
    Ma requête suivante fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT cpt. * 
    FROM lecture, comptage cpt
    WHERE lecture.client = cpt.numero
    AND lecture.ligne = cpt.ligne
    AND cpt.heure = ( 
    SELECT MAX( heure ) 
    FROM comptage cpt2
    WHERE cpt2.date = ( 
    SELECT MAX( date ) 
    FROM comptage cpt3
    WHERE cpt3.numero = lecture.client
    AND cpt3.ligne = lecture.ligne ) 
    AND cpt2.numero = lecture.client
    AND cpt2.ligne = lecture.ligne )
    Malgré tout, quelqu'un pourrait, avec les paramètres qui suivent, me dire pourquoi cette requête prend environ 250secondes pour s'exécuter?

    Dans ma table comptage, j'ai placé des index sur les champs ligne, numero, date et heure.
    Dans ma table lecture, j'ai placé des index sur les champs ligne, client.

    Ma table comptage contient 7500 records et ma table lecture en contient 10 actuellement.
    Ma requête finale me retourne 10 records correspodnant à la table lecture et pour lesquels la date et l'heure sont maximum.

    Je comprend pas la raison de la lenteur d'exécution de cette requête.

    Merci d'avance.

    PS: Je peux fournir la structure des tables si ca peut aider.

  3. #3
    Membre éprouvé
    Profil pro
    Administrateur de base de données
    Inscrit en
    Juillet 2003
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juillet 2003
    Messages : 94
    Par défaut
    La solution si version >= 4.1.x
    Sinon en version inférieure de Mysql, il faut passer obligatoirement
    par 2 tables temporaires :
    - la 1ère se basant sur les MAX(date)
    - la seconde se basant sur les MAX(heure)
    Cette solution peut s'avérer payante si la table comptage est conséquente par la mise en place d'index sur les tables temporaires.

    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
     
    select C.*
    from comptage C,
    (
    select C.numero, C.ligne, C.date, max(heure) heure
    from comptage C,
    (
    SELECT numero, ligne, MAX(date) date FROM comptage
    group by numero, ligne
    ) M
    where M.numero = C.numero
    and M.ligne = C.ligne
    and M.date = C.date
    group by C.numero, C.ligne, C.date
    ) M
    where M.numero = C.numero
    and M.ligne = C.ligne
    and M.date = C.date
    and M.heure = C.heure
    Pour les perfs créer l'index 4 parties (numero, ligne, date, heure)

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2003
    Messages
    298
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 298
    Par défaut
    Bonjour,

    Me revoici sur ce projet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT * FROM lecture, comptage cpt 
    WHERE(lecture.client = cpt.numero) 
    AND lecture.ligne = cpt.ligne 
    AND cpt.heure = 
             (SELECT MAX(heure) 
              FROM comptage cpt2 
              WHERE cpt2.date = 
                     (SELECT MAX(date) 
                       FROM comptage cpt3 
                       WHERE cpt3.numero = lecture.client 
                       AND cpt3.ligne = lecture.ligne) 
              AND cpt2.numero = lecture.client 
              AND cpt2.ligne = lecture.ligne)
    Cette requête fonctionne très bien sauf dans un cas:
    Si, dans ma table comptage, deux comptages pour un client / ligne ont la même heure de saisie.
    Dans ce cas précis, je reçois deux lignes au lieu d'une pour ce client / ligne.

    J'avais le même problème avec les dates, et c'est donc pour cette raison que je compare dabord les heures.


    Merci d'avance pour vos réponses.

Discussions similaires

  1. [MSSQL 2K5] PBM pour mixer deux requêtes en une seule
    Par fredfred dans le forum Langage SQL
    Réponses: 6
    Dernier message: 05/07/2010, 15h12
  2. [PostGreSQL] Trier une liste ayant deux requêtes comme source
    Par Mat_DZ dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 09/08/2006, 10h51
  3. Comparer le contenu de deux requêtes
    Par Floch dans le forum Access
    Réponses: 2
    Dernier message: 04/05/2006, 11h43
  4. [MySQL] Afficher deux requêtes en deux colonnes
    Par SnickeursMan dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 21/11/2005, 11h19
  5. Afficher le ratio du résultat de deux requêtes
    Par decour dans le forum Access
    Réponses: 25
    Dernier message: 07/11/2005, 19h54

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