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

SQL Procédural MySQL Discussion :

Somme d'un element conditionnel


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Par défaut Somme d'un element conditionnel
    Bonjour,

    Je cherche a calculer une somme en php-mysql. Actuellement la somme est effectuée dans le code php mais je me disais que ce serait surement plus rapide dans le code sql directement.

    J'aimerais donner différents poid selon qu'un id se trouve dans tel ou tel group de valeur genre en pseudo code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    si id IN (80,90,199,101)
         SUM=SUM+1;
    SINON SI id IN (30,1,2,34)
          SUM= SUM+0.8;
    SINON SI id IN (31,32,9)
          SUM=SUM-5000000000;
    J'aimerais ensuite pouvoir calculer la somme dans un GROUP BY enfonction de id_doc (la table a une condition d'unicité sur (id,id_doc) Je me suis donc dis qu'il serais plus simple de pouvoir faire un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT sum(c) WHERE c=1 IF id IN (80,90,199,101) OR c=0.8 IF id IN((30,1,2,34).... GROUP BY id_doc
    Une idée ?

    PS: Il s'agit d'un serveur MySQL version 3.23

  2. #2
    Membre Expert Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Par défaut
    A mon avis il est beaucoup plus simple de gérer ce genre de choses dans du code PHP.
    Enfin il y a toujours la fonction CASE ... WHEN (http://dev.mysql.com/doc/mysql/fr/Co...functions.html) mais je doute qu'on puisse l'utiliser dans un GROUP BY

  3. #3
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Par défaut
    Exemple d'usage de la fonction CASE :
    http://www.developpez.net/forums/viewtopic.php?t=192952
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2004
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 44
    Par défaut
    oui, je pense que tu devrais passer par les fonctions IF, CASE, IFNULL, etc.

    un SUM(IF(...)) est possible, mais un SUM(CASE ...) : ... à tester

    si tu peux arriver à gérer cela au niveau de la base plutôt qu'au niveau de l'appli, c'est le top.
    toutes les opérations de regroupements, tris, calculs simples, etc. doivent être au maximum faites au niveau du SGBD : c'est fait pour ça et c'est plus rapide !

  5. #5
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Par défaut
    Citation Envoyé par chicobra
    oui, je pense que tu devrais passer par les fonctions IF, CASE, IFNULL, etc.

    un SUM(IF(...)) est possible, mais un SUM(CASE ...) : ... à tester

    si tu peux arriver à gérer cela au niveau de la base plutôt qu'au niveau de l'appli, c'est le top.
    toutes les opérations de regroupements, tris, calculs simples, etc. doivent être au maximum faites au niveau du SGBD : c'est fait pour ça et c'est plus rapide !
    Je pensais à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CASE id IN (80,90,199,101)
    WHEN SUM (...)
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  6. #6
    Membre Expert Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Par défaut
    Après vérification, un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT sum(CASE WHEN x IN(...) THEN ... ) FROM y
    GROUP BY z
    fonctionne bien (mySQL 4.0).
    Ca m'étonne parce qu'il me semble que j'avais déjà essayé, sans résultat. Enfin tant mieux

    Au niveau de la vitesse, tout dépend du nombre de id_doc. S'il n'y en a que quelques-uns, il n'y aura pas grande différence entre calculer la somme dans la requête et dans le script PHP. Par contre s'il y en a des centaines, c'est sûr que ça économisera du transfert entre le serveur et le script.
    Après, pour des calculs et traitements un peu complexes, je serais plutôt partisan de les laisser dans le code, pour des raisons de lisibilité. Après tout le langage SQL n'est pas tellement fait pour gérer la logique conditionnelle à la base...

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Par défaut
    Excellent !!!

    Ca marche !
    en fait la table a environ 4'000 doc_id et 16'000 id ce qui fait environ 260'000 entrée en tout. (faut dire que c'est un peu une base test, la vrai sera plus petite).

    Je vais faire des tests sur les différences de performences en temps entre les deux solution et je posterais les résultats si ca intéresse quelqu'un.

    Mais ceci semble permettre de retourner que trente résultats ou avant il y avait 3'000 doc_id différents (donc beaucoup de communication inter-processus)..

    Merci encore !

  8. #8
    Membre Expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Par défaut
    Citation Envoyé par Synnalagma
    Je vais faire des tests sur les différences de performences en temps entre les deux solution et je posterais les résultats si ca intéresse quelqu'un.
    Ah oui, les résultats m'intéresseraient. Merci de ton initiative.
    Alexandre Tranchant
    Chef de projet AMO pour le Cerema.
    Retrouvez mes articles sur PHP et Symfony

  9. #9
    Membre Expert Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Par défaut
    Citation Envoyé par Synnalagma
    en fait la table a environ 4'000 doc_id et 16'000 id ce qui fait environ 260'000 entrée en tout.
    Oui, là c'est sûr qu'il vaut mieux régler le maximum de choses directement dans la requête.

    Citation Envoyé par Alexandre T
    Citation Envoyé par Synnalagma
    Je vais faire des tests sur les différences de performences en temps entre les deux solution et je posterais les résultats si ca intéresse quelqu'un.
    Ah oui, les résultats m'intéresseraient. Merci de ton initiative.
    Pareil, si tu peux nous tenir au courant...

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Par défaut
    Bon voila quelque résultat sans que j'ai optimiser tous ce que ceci me permettra d'optmiser.


    Les test ont été effectuer sur un ordinateur avec une mémoire de 256mb sur window$ ce qui explique les temps long. Auparavant j'avais regarder sur un ordi avec 512 sur linux le temp total était d'environ 1.3 secondes.
    Requete SQL (requete avec environ 2500 résultat)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
           avant         |        apres
     6.8 secondes           7.5 secondes
    temp du Code PHP de traitement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
           avant         |        apres
       4 secondes          presque 0 secondes
    en tout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
           avant         |        apres
       11 secondes          presque 7.5 secondes

    Ca fait quand même une bonne amélioration des performences.

    Si j'utilise LIMIT les temps descende vers un total de 4 seconde le probleme est que je dois connaitre le nombre de résultat total et qu'il n'est pas possible de l'avoir avec MySQL 3.23 (a ce que je sache).

    Donc la toujours si vous avez des idées....

    Merci encore

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2004
    Messages : 15
    Par défaut
    Tout ceci m'a permis de voir une optimisation absolument essentiel que j'aurais du voir plus tôt qui fait chuter considérablement les temps (valable que dans certains cas (les plus courants heureusement)).

    A ce stade la différence est encore plus grande car j'arrive à 0.6 seconde pour la nouvelle méthode en tout

    Alors que l'ancienne (mais optimisée) prend environ 4 secondes dont 1.5 seconde de requète sql ( soit 2.5 seconde de code php).

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 14/07/2014, 01h24
  2. Somme de 0, boucle conditionnelle.
    Par Watty dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/07/2008, 11h53
  3. Somme des éléments dans plusieurs fichiers.
    Par AjJi dans le forum Linux
    Réponses: 2
    Dernier message: 11/06/2006, 00h51
  4. Réponses: 2
    Dernier message: 05/02/2006, 22h26
  5. Réponses: 4
    Dernier message: 19/10/2005, 09h20

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