Partage
  • Partager sur Facebook
  • Partager sur Twitter

MySQL: Compteur avec GROUP BY

Existe-t-il une fonction?

Sujet résolu
    21 novembre 2010 à 13:37:05

    Bonjour,

    Merci à ceux qui liront mon message..

    Voici en gros ce que je souhaite obtenir..
    Je dispose d'une table:
    Id FkId Value
    1 1 ValeurX
    2 1 ValeurZ
    3 2 ValeurY
    4 2 ValeurA
    5 1 ValeurB


    Ce que je souhaite, c'est ajouter un compteur qui se réinitialise pour chaque groupe de ma FK, exemple:

    Id FkId Value Compteur
    1 1 ValeurX 1
    2 1 ValeurZ 2
    5 1 ValeurB 3
    3 2 ValeurY 1
    4 2 ValeurA 2


    Je crois qu'une telle fonction existe avec SQL, et s'utilise comme une fonction d'agregation...



    Est ce que vous connaissez sous MySQL une manière d'obtenir se résultat, avec une fonction propre ou avec une magouille!


    Merci d'avance,

    Pasto
    • Partager sur Facebook
    • Partager sur Twitter
      21 novembre 2010 à 14:15:59

      J'ai du mal à cerner l'intérêt. Ca va te servir à quoi au juste ?
      • Partager sur Facebook
      • Partager sur Twitter
        21 novembre 2010 à 16:56:37

        Je ne connais pas de moyen pour faire ceci avec MySQL, à priori tu as besoin d'une fonction analytique.
        • Partager sur Facebook
        • Partager sur Twitter
          21 novembre 2010 à 17:45:03

          Merci pour vos réponses,
          je vais devoir trouver une autre méthode dans ce cas....

          Rotoclap, je t'explique en gros à quoi cela devrait me servir...

          D'un coté j'ai X équipes de Y(x) joueurs à placer.
          De l'autre coté, pour chacune des X équipe j'ai Z(x) positions de départ possible.

          Avec la fonction que je cherche, je peux d'une part numéroter chacun des joueur de chaque équipe, et d'autre part numéroter chacune positions de départs pour chaque équipe.

          Ainsi en faisant une jointure sur les équipes masi aussi sur+ numéroDeJoueur=NuméroDePosition,
          J'obtiens une unique position de départ pour chaque joueur, car la jointure sur mon compteur de part et d'autre m'a permis d'éviter la combinatoire...

          Bref en SQL c'est bien utile...

          Si cette fonction ( dont il faut que je retrouve le nom en SQL) n'existe pas en MySQL, je vais devoir enregistrer les compteurs en dur dans la base de données...

          Bof bof...


          • Partager sur Facebook
          • Partager sur Twitter
            21 novembre 2010 à 17:47:10

            C'est ROW_NUMBER() OVER(PARTITION BY FkId ORDER BY id ASC) que tu cherches, probablement. Mais comme je l'ai dit, les fonctions analytiques ne fonctionnent pas sous MySQL.
            • Partager sur Facebook
            • Partager sur Twitter
              21 novembre 2010 à 18:02:07

              A ouais c'est bien ça !!

              Bon ba j'ai un peu les boules que ça n'existe pas sous MySQL...

              En tous c'est sympa de me redonner le nom de la fonction sous SQL: ca me donne une bille en plus pour trouver quelqu'un qui a eu le même problème que moi: on verra comment il a pu le contourner !

              Bonne soirée et merci encore,


              Edit: voici ce que j'ai trouvé sur le net,

              C'est plutôt astucieux, mais comme c'est souligné, il ne faut l'utiliser que pour un nombre limité d'enregistrement car ça complexifie la requete...
              Je vais voir si je peux transposer à mon cas...




              When the data has multiple partitions

              If the data has multiple partitions, the solution is more complex. Here is one possible solution:

              create table fruits (
              type varchar(10) not null,
              variety varchar(20) not null,
              primary key(type, variety));

              insert into fruits values
              ('apple', 'gala'),
              ('apple', 'fuji'),
              ('apple', 'limbertwig'),
              ('orange', 'valencia'),
              ('orange', 'navel'),
              ('pear', 'bradford'),
              ('pear', 'bartlett'),
              ('cherry', 'bing'),
              ('cherry', 'chelan');

              select l.type, l.variety, count(*) as num
              from fruits as l
              left outer join fruits as r
              on l.type = r.type
              and l.variety >= r.variety
              group by l.type, l.variety;

              +--------+------------+-----+
              | type | variety | num |
              +--------+------------+-----+
              | apple | fuji | 1 |
              | apple | gala | 2 |
              | apple | limbertwig | 3 |
              | cherry | bing | 1 |
              | cherry | chelan | 2 |
              | orange | navel | 1 |
              | orange | valencia | 2 |
              | pear | bartlett | 1 |
              | pear | bradford | 2 |
              +--------+------------+-----+

              Here I’ve partitioned the data by the type column, so there are four partitions (apple, cherry, orange, pear). Notice the num column starts at 1 for each partition and counts upward.

              The drawback to this solution is the LEFT OUTER JOIN with the >= in the join condition. This effectively makes the join a CROSS JOIN, which is inefficient (O(n2)). It may be a good idea to avoid this except on small data sets.


              • Partager sur Facebook
              • Partager sur Twitter

              MySQL: Compteur avec GROUP BY

              × 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