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 :

Optimiser des requetes


Sujet :

Requêtes MySQL

  1. #1
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut Optimiser des requetes
    Bonjour,

    J'ai une table des commandes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    id_commande, client, date
    J'ai une table des reglements des commandes

    Une commande pouvant avoir plusieurs règlements et un règlement pouvant payer plusieurs commande, j'ai une table permettant de lier les tables commandes et règlement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    id_commande, id_reglement
    Je veux connaître le nombre de commandes réglées par date de commande, je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT date, COUNT(*)
    FROM commandes
    WHERE id_commande IN
    (SELECT DISTINCT id_commande
    FROM commandes_liens_reglements)
    GROUP BY date
    Je veux connaître le total réglé par date de commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT date, SUM(montant)
    FROM commandes
    LEFT OUTER JOIN 
    (SELECT id_commande, SUM(montant) AS montant
    FROM commandes_liens_reglements
    LEFT OUTER JOIN reglements USING(id_commande)
    GROUP BY id_commande)
    AS commandes_liens_reglements USING(id_commande)
    GROUP BY date
    Peut-on optimiser ces requetes.

    Merci d'avance.
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Pour la première requête, il est souvent préférable de remplacer une sous-requête avec un IN par un INNER JOIN. Par contre, il faut alors ruser pour ne pas compter plusieurs fois la même commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT date, COUNT(DISTINCT id_commande)
    FROM commandes
    INNER JOIN commandes_liens_reglements USING (id_commande)
    GROUP BY date
    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2009
    Messages : 15
    Points : 19
    Points
    19
    Par défaut
    Bonjour,

    Comme il est utilsé une table nn entre la table commande et la table reglement, je préconiserai le mettre le montant dans cette table.
    Ceci permettra de savoir pour un reglement, quels sont les montants affectés à chaque commande et aussi de déterminer la date des commandes liés aux réglements

    Table des commandes :
    id_commande, client, date

    Table des réglements :
    id_reglement

    Table commandes_liens_reglements
    id_commande, id_reglement, montant.

    Ta deuxième requete devrait donner ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DATE, SUM(MONTANT) FROM reglements
    INNER JOIN commandes_liens_reglements using(id_reglement)
    inner join commandes using (id_commande)
    group by date

  4. #4
    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,
    La question que je me pose, du coup, c'est à quoi servira la table règlements ?
    Si elle n'a plus qu'un attribut, son identifiant, le chat est maigre.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mars 2009
    Messages : 15
    Points : 19
    Points
    19
    Par défaut
    A y mettre ses propres information comme la date du reglement et qui a reglé.

    A toi de voir mais je pense qu'il y aura à terme des informations dans cette table.

  6. #6
    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
    Tu as raison, mode de règlement ou autres.
    Bien vu.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  7. #7
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Pardon, je reviens sur le sujet.

    Très bien vu Fabrice MEMBRÉ, effectivement, j'ai la date du règlement, le mode de règlement, la banque si c'est un chèque, l'écart éventuel entre le montant attendu et le montant réellement réglé et le montant réglé.

    Toi tu mettrais sur la table liant commandes et règlements le montant réglé.

    Le montant réglé de la commande ou le montant total réglé avec ce règlement.

    Je m'explique : je reçois un chèque de 100 euros soldant les commandes 123 et 124 pour des montants respectifs de 70 et 30 euros

    Table commandes_liens_reglements id_commande, id_reglement, montant aura donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    123, 1, 100
    124, 1, 100
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    123, 1, 70
    124, 1, 30
    et éventuellement le total sur la Table des réglements : id_reglement, montant total
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  8. #8
    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
    Citation Envoyé par lodan Voir le message
    le total sur la Table des réglements : id_reglement, montant total
    Le total pouvant être obtenu par requête avec SUM et GROUP BY, son écriture dans la base ne s'impose qu'en cas de recherche d'optimisation, mais avec la contrepartie de s'assurer de garder la cohérence entre la somme des montants de ce règlement dans la table liens et le montant total dans la table règlements.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  9. #9
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Dans notre cas, un client peut payer une partie par CB, une autre par chèque (acompte et solde)

    Dans ce cas comment mettre en place un montant payer par commande.
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

  10. #10
    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
    Je ne vois pas ce que ça change, le mode de paiement serait un attribut de la table règlements si je me souviens bien.

    Un autre point fonctionnel me préoccupe.
    En fait, on ne paye pas une commande, on paye une facture liée à une commande et une (des) livraison(s).
    En tout cas c'est comme ça que ça se passe quand je fais un achat à la FNAC ou chez Amazon ou Eyrolles.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  11. #11
    Membre extrêmement actif Avatar de lodan
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    2 064
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 064
    Points : 682
    Points
    682
    Par défaut
    Oui sur facture bien sûr.

    Bon, je réfléchis à mon multi règlement

    Merci encore
    Y a pas, plus on fait, plus on sait. Plus on cherche, plus on sait chercher. Maintenant quant à trouver, c'est autre chose.

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

Discussions similaires

  1. Optimisation des Requete Tsql a l'aide des index
    Par AzizMaroc dans le forum Développement
    Réponses: 2
    Dernier message: 13/03/2009, 11h42
  2. Ajax & Optimisation des requetes HTTP
    Par Spir dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 18/09/2008, 11h27
  3. Optimisation des requetes SQL
    Par elharet dans le forum SQL
    Réponses: 3
    Dernier message: 14/11/2007, 21h26
  4. [sgbd]Optimisation des requetes Oracle/Perl
    Par linou dans le forum SGBD
    Réponses: 7
    Dernier message: 30/06/2005, 18h09
  5. Optimisation des requetes
    Par bifidus dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 06/10/2003, 11h29

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