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 :

Optimisation d'une requête contenant des sous-requêtes


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé Avatar de Christophe Charron
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2005
    Messages
    920
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2005
    Messages : 920
    Points : 606
    Points
    606
    Par défaut Optimisation d'une requête contenant des sous-requêtes
    Bonjour,

    Est-il possible et si oui, comment, d'optimiser ce genre de requête qui a pour objectif d'aller chercher pour n articles, parmi n lignes de réception, le dernier prix et quelques autres informations , sur la ligne de réception qui a été réceptionnée le plus dernièrement?
    Ce sont les sous-requêtes qui sont chrono-phages mais je ne vois pas comment ne pas les employer pour ne récupérer que la dernière réception.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select f3.actif,f3.art_cleunik,f3.code,f3.description,f4.der_pa,
    DATE_FORMAT(f4.dateheure_der_achat, GET_FORMAT(DATE, 'EUR')) as date_der_achat_clair,
    f3.nbdec_prix,f4.dateheure_der_achat,
    (SELECT f1.pu FROM _recfou_lignes f1 left join _recfou_entetes f2 on f1.commercial_cleunik=f2.commercial_cleunik where f1.code_interne=f3.code order by f2.dateheureexpedition desc LIMIT 1) as pu,
    (SELECT f2.dateheureexpedition FROM _recfou_lignes f1 left join _recfou_entetes f2 on f1.commercial_cleunik=f2.commercial_cleunik where f1.code_interne=f3.code order by f2.dateheureexpedition desc LIMIT 1) as dateheure_reception,
    (SELECT DATE_FORMAT(f2.dateheureexpedition, GET_FORMAT(DATE, 'EUR')) FROM _recfou_lignes f1 left join _recfou_entetes f2 on f1.commercial_cleunik=f2.commercial_cleunik where f1.code_interne=f3.code order by f2.dateheureexpedition desc LIMIT 1) as dateheure_reception_clair,
    (SELECT f1.commercial_ligne_cleunik FROM _recfou_lignes f1 left join _recfou_entetes f2 on f1.commercial_cleunik=f2.commercial_cleunik where f1.code_interne=f3.code order by f2.dateheureexpedition desc LIMIT 1) as commercial_ligne_cleunik,
     (SELECT f1.commercial_cleunik FROM _recfou_lignes f1 left join _recfou_entetes f2 on f1.commercial_cleunik=f2.commercial_cleunik where f1.code_interne=f3.code order by f2.dateheureexpedition desc LIMIT 1) as commercial_cleunik 
     from _article f3 left join _art_achats f4 on f3.art_cleunik=f4.art_cleunik where 
    (SELECT pu FROM _recfou_lignes f1 left join _recfou_entetes f2 on f1.commercial_cleunik=f2.commercial_cleunik where f1.code_interne=f3.code order by dateheureexpedition desc LIMIT 1) is not null AND f3.actif=1 and f3.description like '%%' ORDER BY `description` ASC LIMIT 0, 1000
    D'avance, merci pour vos lumières?

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    En première analyse, je pense qu'il vaudrait bien mieux rapatrier les colonnes des sous-requêtes en une seule requête dans une ligne d'une table temporaire.

  3. #3
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Est-il possible et si oui, comment, d'optimiser ce genre de requête qui a pour objectif d'aller chercher pour n articles, parmi n lignes de réception, le dernier prix et quelques autres informations , sur la ligne de réception qui a été réceptionnée le plus dernièrement?
    Euh... j'ai du mal à comprendre ce que doit faire la requête, même avec cette description !

    Les sous-requêtes du SELECT et du WHERE devraient pouvoir avantageusement être remplacées par des jointures. Il restera sûrement une à plusieurs sous-requêtes parce que tu cherches des "dernières réceptions" mais la requête y gagnera sûrement en clarté.

    La signification du nom des tables, leur structure et un exemple de données nous aiderait aussi à mieux comprendre et donc à t'aider plus efficacement.

    Parce que si _recfou_entetes et _recfou_lignes sont les tables relativent à la réception des articles, je suis étonné que la jointure entre ces deux tables se fasse sur le commercial_cleunik (l'identifiant du commercial ?).

    Ta requête remise en forme pour la rendre un peu plus lisible :
    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
    SELECT f3.actif, f3.art_cleunik, f3.code, f3.description, f4.der_pa,
      DATE_FORMAT(f4.dateheure_der_achat, GET_FORMAT(DATE, 'EUR')) AS date_der_achat_clair,
      f3.nbdec_prix, f4.dateheure_der_achat,
      (
        SELECT f1.pu 
        FROM _recfou_lignes f1 
        LEFT JOIN _recfou_entetes f2 ON f1.commercial_cleunik = f2.commercial_cleunik 
        WHERE f1.code_interne = f3.code 
        ORDER BY f2.dateheureexpedition DESC 
        LIMIT 1
      ) AS pu,
      (
        SELECT f2.dateheureexpedition 
        FROM _recfou_lignes f1 
        LEFT JOIN _recfou_entetes f2 ON f1.commercial_cleunik = f2.commercial_cleunik 
        WHERE f1.code_interne = f3.code 
        ORDER BY f2.dateheureexpedition DESC 
        LIMIT 1
      ) AS dateheure_reception,
      (
        SELECT DATE_FORMAT(f2.dateheureexpedition, GET_FORMAT(DATE, 'EUR')) 
        FROM _recfou_lignes f1 
        LEFT JOIN _recfou_entetes f2 ON f1.commercial_cleunik = f2.commercial_cleunik 
        WHERE f1.code_interne = f3.code 
        ORDER BY f2.dateheureexpedition DESC 
        LIMIT 1
      ) AS dateheure_reception_clair,
      (
        SELECT f1.commercial_ligne_cleunik 
        FROM _recfou_lignes f1 
        LEFT JOIN _recfou_entetes f2 ON f1.commercial_cleunik = f2.commercial_cleunik 
        WHERE f1.code_interne = f3.code 
        ORDER BY f2.dateheureexpedition DESC 
        LIMIT 1
      ) AS commercial_ligne_cleunik,
      (
        SELECT f1.commercial_cleunik 
        FROM _recfou_lignes f1 
        LEFT JOIN _recfou_entetes f2 ON f1.commercial_cleunik = f2.commercial_cleunik 
        WHERE f1.code_interne = f3.code 
        ORDER BY f2.dateheureexpedition DESC 
        LIMIT 1
      ) AS commercial_cleunik 
     
    FROM _article f3 
    LEFT JOIN _art_achats f4 ON f3.art_cleunik = f4.art_cleunik 
    WHERE (
      SELECT pu 
      FROM _recfou_lignes f1 
      LEFT JOIN _recfou_entetes f2 ON f1.commercial_cleunik = f2.commercial_cleunik 
      WHERE f1.code_interne=f3.code 
      ORDER BY dateheureexpedition DESC 
      LIMIT 1
    ) IS NOT NULL 
      AND f3.actif=1 
      AND f3.description LIKE '%%' 
    ORDER BY `description` ASC 
    LIMIT 0, 1000

Discussions similaires

  1. optimisation d'une vue avec plusieurs sous-requêtes
    Par jean62 dans le forum Développement
    Réponses: 7
    Dernier message: 08/08/2012, 15h29
  2. Utiliser une jointure ou des sous-requêtes
    Par seabs dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/03/2011, 21h02
  3. Afficher des sous-requêtes dans une requête
    Par ZashOne dans le forum Sql*Plus
    Réponses: 6
    Dernier message: 16/04/2008, 10h07
  4. exprimer des sous requêtes
    Par Smix007 dans le forum SQL
    Réponses: 2
    Dernier message: 12/07/2007, 18h07
  5. Paramètre d'une sous requète venant de la requète mère
    Par silver.spike dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/06/2007, 10h42

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