Partage
  • Partager sur Facebook
  • Partager sur Twitter

SELECT tant que la somme d'un champ <= valeur fixe

MySQL

Sujet résolu
    16 décembre 2011 à 21:09:08

    Salut les amis Zér0 ! ^^

    Je cherche a faire une requête assez étrange mais somme toute évidente et je ne suis pas parvenu à trouver la syntaxe adaptée.

    J'ai une table contenant un champ avec une valeur entière. J'aimerais sélectionner des entrées de cette table tant que la somme des valeurs de ce champs est inférieure ou égale à une valeur fixe (par exemple 8). Je fais cette requête en imposant une clause ORDER BY.

    Par exemple si la table contient des entrées avec comme valeurs de ce champs :

    3
    4
    6
    2

    La requête retournera les 3 première entrées pour une valeur fixe de 8 puisque 3 + 4 < 8 mais 3 + 4 + 6 > 8. Pour une autre table avec ces valeurs :

    1
    2
    2
    1
    2

    La requête retournera toutes les entrées, 1 + 2 + 2 + 1 + 2 = 8.

    J'ai pensé à utiliser SUM() dans la clause WHERE, mais la clause WHERE ne semble pas adaptée pour un comportement "tant que".

    Voilà, si vous avez une idée, c'est avec joie :)

    Salutations et bon week-end
    • Partager sur Facebook
    • Partager sur Twitter
    Don't be serious but do it seriously.
      16 décembre 2011 à 21:19:16

      Sans nous dire à quoi correspond ta clause ORDER BY, c'est impossible de répondre à ta question. Il n'y a pas d'ordre dans une table, on ne peut pas deviner ce que tu veux.
      • Partager sur Facebook
      • Partager sur Twitter
        16 décembre 2011 à 21:33:27

        La clause ORDER BY n'a aucun rapport avec le but de la requête. Mais admettons qu'elle soit ORDER BY id DESC où id est un champs auto-incrémenté qui n'est pas le champs traité.
        • Partager sur Facebook
        • Partager sur Twitter
        Don't be serious but do it seriously.
          16 décembre 2011 à 21:35:11

          Aucun rapport ? Et tu fais comment pour calculer la somme d'une séquence de nombres si tu ne sais pas dans quel ordre la séquence arrive ? Ça donne invariablement un résultat indéfini et imprévisible.

          Apparemment, tu sais ce que tu fais, donc je te laisse te débrouiller. Bonne chance.
          • Partager sur Facebook
          • Partager sur Twitter
            16 décembre 2011 à 21:38:20

            Aucun rapport parce que l'ordre ne change pas l'expression. Si je précise que j'utilise une clause ORDER BY c'est bien parce que sans celle-ci la requête n'a pas de sens.

            Pour autant elle n'est pas incriminée dans le condition de fin. Quel que soit l'ordre, l'expression indiquant la fin de la requête (à la manière d'une boucle while) reste la même.

            Citation : aslo

            Je n'ai rien dit -_-


            OK, merci d'avoir essayé ;)
            • Partager sur Facebook
            • Partager sur Twitter
            Don't be serious but do it seriously.
              16 décembre 2011 à 21:41:20

              Comme tu ne comprends visiblement pas ce que j'essaie de t'expliquer, je vais faire simple.

              Tu as un ensemble {1,4,7,2,9}. Il n'y a pas d'ordre dans un ensemble. Tu demandes de récupérer les nombres dont la somme totale est inférieure à 8. On ne peut pas savoir si c'est le nombre 9 qui arrive en premier ou le nombre 1 parce qu'il n'y a pas d'ordre dans un ensemble.

              Tu donnes une partie d'un problème qui ne représente même pas le vrai problème, et tu t'entêtes à refuser de nous donner plus d'informations. S'il y a bien un truc qui m'horripile énormément, c'est ton attitude.
              • Partager sur Facebook
              • Partager sur Twitter
                16 décembre 2011 à 21:52:25

                Je comprend ce que tu veux dire et c'est vrai, mais je me suis penché suffisamment sur la question pour savoir que ça n'a pas d'importance significative.

                Tu vas comprendre si je reprend ton exemple :

                J'ai toujours mon expression "retourner des entrées tant que la somme du champs est inférieure au égale à 8" qui est ce que je cherche à faire.

                Une table avec les valeurs :
                1
                4
                7
                2
                9

                Les 3 premières entrées seront retournées.

                Dans un autre ordre :
                4
                2
                1
                9
                7

                Les 4 premières entrées seront retournées.

                Bref, quel que soit l'ordre, c'est la condition citée plus haut qui m'intéresse. Une table avec un seul champs sans clause ORDER BY suffit à décrire ce cas.

                Si je ne parle pas du cas particulier d'un ORDER BY sur le champs traité c'est que je n'ai pas l'intention de le faire. En réalité je fais un ORER BY id DESC. Mais ça ne permet pas d'obtenir un ordre précis pour le champs en question.

                Quand aux informations, je ne peux pas les inventer, il n'y en a pas d'autre. Je peux donner les autres champs de la table, mais ils ne contiennent aucune données utiles à la requête que je souhaite faire.
                Je peux dire pour préciser que la valeur du champs est le total d'éléments présents dans un autre champs. Ca me permet donc de limiter le nombre de résultats pour un nombre d'éléments donnés.

                Je ne sais pas si je n'ai pas été assez clair sur ce que j’essaie de faire dans mon premier poste. Si je t'ai froissé je m'excuse sincèrement, ça n'étais évidemment pas mon intention :)
                • Partager sur Facebook
                • Partager sur Twitter
                Don't be serious but do it seriously.
                  17 décembre 2011 à 9:32:51

                  Une requête SQL n'est pas une boucle while, tu ne peux pas faire ce que tu veux de façon simple...

                  Je suppose que le but est de ne pas ramener toute la table, seulement les grosso modo 8 premières lignes ou moins, en suivant l'index sur id, donc d'éviter un tri.

                  Si tu ne veux pas ramener toute la table, utilise un curseur.

                  Le plus facile serait de faire une procédure stockée du genre :

                  FOR ligne IN SELECT * FROM table ORDER BY id 
                  BEGIN   
                     somme:=somme.ligne.valeur;
                     if somme > limite RETURN
                     RETURN NEXT ligne
                  END
                  


                  Ou, si tu sais que la valeur vaut au moins 1, mets juste un LIMIT 8 !...

                  • Partager sur Facebook
                  • Partager sur Twitter
                    17 décembre 2011 à 10:55:12

                    Je vais me limiter à une clause LIMIT je pense. Après quelques recherches je vois que ça reste la solution la plus acceptable.

                    Merci pour votre aide ^^
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Don't be serious but do it seriously.

                    SELECT tant que la somme d'un champ <= valeur fixe

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown