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

MySQL Discussion :

Calculer une clé de regroupement / transaction ?


Sujet :

MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Par défaut Calculer une clé de regroupement / transaction ?
    Bonjour,

    J'ai une table t_mouvements avec un idMvt autoincrémenté. Dans cette table, il y a une date et un type et une provenance (dateMvt, FK_idType et FK_idOrigine).

    Je voudrais regrouper les mouvements / (date + Type + origine) et stocker ce numéro de groupe dans ma table dans un champs idGroupe.

    Dans un premier temps, je pensais faire une simple requête MAX(idGroupe)+1 mais l'insertion des mouvements peut prendre entre 10 et 15
    secondes suivant la masse d'information. Donc, je ne suis pas à l'abris qu'un utilisateur demande un MAX et qu'en parallèle, un autre fasse
    aussi la même demande.
    J'ai aussi une idée, c'est de faire une table t_groupes avec un idGroupe autoincrémenté mais cette table n'aurait absolument aucune utilité
    (sauf celle de servir de générateur de clé).

    Bref, j'ai plusieurs pistes de mon côté mais je voulais savoir si quelqu'un avait déjà eu ce genre de problème et savoir quelle piste avait
    été suivie.

    Merci d'avance,

  2. #2
    Membre Expert
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    946
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 946
    Par défaut
    Bonjour

    Je ne vois pas trop l'intérêt de ce que vous voulez faire. A moins d'avoir mal compris.

    Je voudrais regrouper les mouvements / (date + Type + origine
    Cela voudrait-il dire que dans la table t_Mouvement, vous pourriez avoir plusieurs lignes ayant les mêmes infos? Des doublons? Or si dans cette table il n'y a que ces 4 colonnes, je ne vois pas l'intérêt des doublons, je veux dire, je ne vois pas comment on pourrait avoir des doublons.

    A moins que en lisant ceci

    et stocker ce numéro de groupe dans ma table dans un champs idGroupe
    vous vouliez dans une autre faire référence à une ligne de la table Mouvement.
    Dans ce cas, pourquoi vouloir créer une colonne concaténant Date + Type + origine, puisque vous pouvez le désigner par idMvt?

    A moins que vous vouliez que la table mouvement ait une colonne "libellé" du mouvement, correspondant à la concaténation de Date + Type + origine?
    Dans ce cas, on peut créer une nouvelle colonne et la remplir manuellement. Ou peut-être avec un trigger (je ne maitrise pas, mais quelque chose comme "Si quelque chose dans colonne Date ou dans colonne Type ou dans colonne origine, alors la colonne Libellé est le résultat de la concaténation des trois précédentes colonnes."

    Pierre

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Par défaut
    Bonjour Pierre et merci d'avoir pris le temps de vous pencher sur mon
    problème.

    l' id du mouvement, c'est - et vous l'avez compris - une clé primaire.
    Ensuite, la date, le type et l'origine) dépendent naturellement de qui
    fait le mouvement, de son type (par exemple ENTREE / SORTIE) et à
    quelle date.

    Je peux donc avoir (respectivement idMvt, date, type, origine) les
    données suivantes :

    1 - 2015-01-01 - IN - DEPOT 1
    2 - 2015-01-01 - IN - DEPOT 1
    3 - 2015-01-01 - OUT - DEPOT 1
    4 - 2015-01-02 - IN - DEPOT 1
    5 - 2015-01-02 - OUT - DEPOT 2

    Donc, effectivement je peux concaténer les champs mais, pour des
    raisons de simplification, je voulais rajouter un champ GROUPR

    1 - 2015-01-01 - IN - DEPOT 1 - 1
    2 - 2015-01-01 - IN - DEPOT 1 - 1
    3 - 2015-01-01 - OUT - DEPOT 1 - 2
    4 - 2015-01-02 - IN - DEPOT 1 - 3
    5 - 2015-01-02 - OUT - DEPOT 2 - 4

    Je pensais, par la suite, faire une requête de type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT (idGroupe)
    FROM t_mouvements
    Et ensuite, pour chaque groupe, une autre requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM t_mouvements
    WHERE idGroupe = N
    A moins que vous ayez une idée aussi qui me permettrait de sortir
    ce type de requête

    DATE, TYPE, ORIGINE, {liste des idMouvements}

    Merci d'avance, en espérant avoir pu apporter les informations
    complémentaires.

  4. #4
    Membre Expert
    Homme Profil pro
    tripatouilleur de code pour améliorer mon quotidien boulistique
    Inscrit en
    Février 2008
    Messages
    946
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : tripatouilleur de code pour améliorer mon quotidien boulistique
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2008
    Messages : 946
    Par défaut
    Bonsoir

    Ce que je ne comprends pas c'est la différence entre

    1 - 2015-01-01 - IN - DEPOT 1
    et

    2 - 2015-01-01 - IN - DEPOT 1
    En l'état il n'y a que l'ID qui change ce qui n'est pas pertinent. Soit des infos manquent, soit votre base est mal construite.

    Je soupçonne que l'ID 1 correspond à une marchandise, ou à un client ou à un modèle bref à quelque chose.

    Votre table ne devrait-elle pas être plutôt ainsi :

    Mvt_ID
    Mvt_Date
    Mvt_Type
    Mvt_origine
    Mvt_Produit
    Mvt_Manutentionnaire


    Pierre

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Par défaut
    Bonjour Pierre,

    Oui, effectivement, il y a d'autres clés qui rentrent en jeu
    (FK_idArticle et FK_idCariste).

  6. #6
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 883
    Par défaut
    Salut youpitralala.

    Je suis comme pier.antoine, je ne comprends pas ce que vous essayez de faire.
    Dans l'exemple, j'ai bien compris que la cinquième colonne correspond à 'idgroupe' ou à 'GROUPR'. Oui, vous avez changé le nom de votre colonne entre vos deux messages.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1 - 2015-01-01 - IN  - DEPOT 1 - 1
    2 - 2015-01-01 - IN  - DEPOT 1 - 1
    3 - 2015-01-01 - OUT - DEPOT 1 - 2
    4 - 2015-01-02 - IN  - DEPOT 1 - 3
    5 - 2015-01-02 - OUT - DEPOT 2 - 4
    Comment procédez-vous pour remplir cette cinquième colonne ?
    Il semble que vous oubliez de nous indiquez des informations importantes pour résoudre votre problème.

    @+

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Par défaut
    Bonjour Artemus,

    Mon problème c'est bien cela, j'aimerai remplir la cinquième colonne !

    Pour simplifier, voici le process. Un cariste fait des entrées-sorties d'un
    magasin d'origine à un magasin de destination. Ces entrées-sorties
    correspondent donc à des mouvements qui sont identifiés, a minima,
    par un id, un type (IN / OUT), une date et une origine. A ces données,
    se rajoutent naturellement l'id du cariste, l'id de l'article et d'autres
    données.

    Cependant, à l'affichage, je souhaite regrouper les lignes uniquement
    par TYPE / DATE et ORIGINE. Le but étant de concentrer les lignes vu
    que le client cherche à savoir combien de mouvements ont été réalisés
    pour une date, un dépôt et un type. Le détail étant visible en option par
    un clic sur le bouton "DETAIL" de mon datatable.

    Donc, à partir des données suivantes (qui je répète) ne reflètent pas
    l'intégralité des champs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1 - 2015-01-01 - IN  - DEPOT 1
    2 - 2015-01-01 - IN  - DEPOT 1
    3 - 2015-01-01 - OUT - DEPOT 1
    4 - 2015-01-02 - IN  - DEPOT 1
    5 - 2015-01-02 - OUT - DEPOT 2
    Je souhaite ne retenir que ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    2015-01-01 - IN  - DEPOT 1
    2015-01-02 - IN  - DEPOT 1
    2015-01-02 - OUT - DEPOT 2
    Je sais bien que je peux faire une simple requête
    ne retenant que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT DISTINCT date, typeMvt, idOrigine
    ...
    Mais je pensais judicieux de faire, au moment de l'ajout du mouvement
    une pré-requête de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $groupe = SELECT MAX(idGroupe)+1
    ...
    INSERT INTO t_mouvements (date, typeMvt, idOrigine, igGroupe)
    VALUES (..., ...,..., $groupe)
    Ce qui me simplifiait ensuite les traitements car je n'avais qu'à stocker
    un data-id = idGroupe dans le bouton DETAIL.

    Pour info, pour l'instant, je fonctionne avec 2 requêtes et cela fonctionne
    bien.

    Donc, pour simplifier la réflexion, un SELECT MAX+1 ne me plait pas car
    je pense que mon traitement d'insertion des lignes peut prendre 10-15
    secondes et donc je ne suis pas à l'abri que le SELECT MAX+1 ne soit
    pas demandé aussi par un autre utilisateur.

    La deuxième réflexion - mais là, je me maîtrise pas, c'est de faire une
    requête de type
    SELECT date, typeMvt, idOrigine, {liste des idMouvements séparés par des | ou de @ ou autre}
    qui éviterait un champ idGroupe inutile.

    Au final, mon problème ne réside pas dans la structure de ma table qui
    est correcte mais dans la restitution des données.

    Merci !

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 600
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 600
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par youpitralala Voir le message
    Cependant, à l'affichage, je souhaite regrouper les lignes uniquement
    par TYPE / DATE et ORIGINE.
    [...]
    Donc, à partir des données suivantes (qui je répète) ne reflètent pas
    l'intégralité des champs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    1 - 2015-01-01 - IN  - DEPOT 1
    2 - 2015-01-01 - IN  - DEPOT 1
    3 - 2015-01-01 - OUT - DEPOT 1
    4 - 2015-01-02 - IN  - DEPOT 1
    5 - 2015-01-02 - OUT - DEPOT 2
    Je souhaite ne retenir que ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    2015-01-01 - IN  - DEPOT 1
    2015-01-02 - IN  - DEPOT 1
    2015-01-02 - OUT - DEPOT 2
    Du coup, soit l'exemple de résultat n'est pas bon, soit c'est l'explication, car la ligne 3 aurait du sortir en résultat
    Ou alors c'est moi qui n'ai rien compris

  9. #9
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 883
    Par défaut
    Salut youpitralala.

    Citation Envoyé par youpitralala
    Cependant, à l'affichage, je souhaite regrouper les lignes uniquement par TYPE / DATE et ORIGINE. Le but étant de concentrer les lignes vu que le client cherche à savoir combien de mouvements ont été réalisés pour une date, un dépôt et un type. Le détail étant visible en option par un clic sur le bouton "DETAIL" de mon datatable.
    D'accord ! Donc tu fais un regroupement sur trois colonnes.
    Puis, à chaque insertion, tu désires vérifier si le triplé est déjà présent ou pas dans ta table.
    S'il est déjà présent, tu mets le même numéro de groupe dans la nouvelle insertion.
    S'il n'est pas présent alors tu mets le plus grand numéro de groupe en ajoutant +1.

    Bien entendu cela va se faire dans l'ordre d'insertion.
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE IF NOT EXISTS `test`
    (
      `id`      integer unsigned NOT NULL AUTO_INCREMENT,
      `date`    date             NOT NULL,
      `type`    char(03)         NOT NULL,
      `depot`   tinyint          NOT NULL,
      `groupe`  integer unsigned     NULL,
      PRIMARY KEY (`Id`),
      INDEX `idx` (`date`,`type`,`depot`)
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP TRIGGER IF EXISTS `groupe`
    --------------
     
    --------------
    CREATE TRIGGER `groupe`
    BEFORE INSERT ON `test`
    FOR EACH ROW BEGIN
        SET NEW.groupe=ifnull((select groupe from test where date=new.date and type=new.type and depot=new.depot),ifnull((select max(groupe)+1 from test),1));
    END
    --------------
     
    --------------
    insert into `test` (`date`,`type`,`depot`) values
    ('2015-11-01', 'In',  1),
    ('2015-11-02', 'In',  1),
    ('2015-11-01', 'Out', 1),
    ('2015-11-02', 'Out', 2),
    ('2015-11-01', 'In',  1)
    --------------
     
    --------------
    select * from test order by date, type, depot
    --------------
     
    +----+------------+------+-------+--------+
    | id | date       | type | depot | groupe |
    +----+------------+------+-------+--------+
    |  1 | 2015-11-01 | In   |     1 |      1 |
    |  5 | 2015-11-01 | In   |     1 |      1 |
    |  3 | 2015-11-01 | Out  |     1 |      3 |
    |  2 | 2015-11-02 | In   |     1 |      2 |
    |  4 | 2015-11-02 | Out  |     2 |      4 |
    +----+------------+------+-------+--------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Je n'ai fait que reprendre ton exemple et obtenir par un trigger le même résultat.

    @+

  10. #10
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 883
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 883
    Par défaut
    Salut Escartefigue.

    J'ai traité que l'exemple du message #3.
    L'autre exemple du message #7 me semble faux, ou alors, je n'ai rien compris.

    @+

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 86
    Par défaut
    Bonjour Artemus,

    C'est exactement cela et je pense que ta solution devrait me servir.

    Au temps pour moi pour les erreurs dans mes explications, j'ai effectivement
    oublié d'ajouter une ligne dans le résultat que je souhaitais obtenir. L'effet
    copier-coller a eu raison de moi. Je m'en excuse encore très platement.

    Je vais modifier mon code pour tenir compte de ma nouvelle colonne groupe.

    Juste pour info, pour l'instant, j'ai une requête qui tourne et qui me donne
    donc les 3 champs grace à un savant SELECT DISTINCT date, typeMvt, idOrigine.
    Et, pendant la lecture de ma requête, je récupère la liste des mouvements concernés
    avec un SELECT idMvt WHERE date = ... AND typeMvt = ... AND idOrigine = ...
    Je constitue un tableau avec ids[] = idMvt pour chaque ligne de mouvement
    issu de la requête ci-dessus.
    Et donc, je renvoie à la fin dans mon datatable un élément avec une propriété
    data-id=implode("|", ids)

    Du coup, comme je peux avoir de 1 à n ids, la propriété data-id peut être
    relativement importante.

    C'est la raison pour laquelle ce champ idGroup va m'être très utile.

    Merci à tous, je marque la conversation comme étant résolue.
    Bonne journée.

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

Discussions similaires

  1. calculer une date Langage c
    Par nestam dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/09/2005, 15h51
  2. Réponses: 7
    Dernier message: 05/07/2005, 16h50
  3. methode qui calcul une moyenne du traffic
    Par siry dans le forum Développement
    Réponses: 7
    Dernier message: 05/05/2005, 17h16
  4. Calculer une duree entre 2 dates
    Par d.w.d dans le forum C++
    Réponses: 7
    Dernier message: 02/03/2005, 22h39
  5. calculer une moyenne avec une requete externe
    Par allowen dans le forum Langage SQL
    Réponses: 3
    Dernier message: 27/01/2005, 16h02

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