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 :

Incrémenter a tous les 4 enregistrements


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Par défaut Incrémenter a tous les 4 enregistrements
    Bonjour et merci pour votre aide.

    j'ai une Bdd dans lequel j'ai les champs nom,cps,pts etc....

    Dans cette Bdd il n'y a pas de champs heure.

    Voici ce que je voudrais voir image jointe

    Est-ce possible d'ajouter une colonne Heure incrémenter à tous les 4 enregistrements et si oui comment je fait cela.
    Images attachées Images attachées  

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 292
    Par défaut
    La fonction ORD() te donne le code ASCII d'un caractère, et te permet donc de transformer ton nom en numéro. Démonstration :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT ORD(LOWER(nom)) - 97 AS numero, nom
    FROM ta_table
    Une ligne sur quatre, ça suppose donc un modulo de zéro ; quant à ton heure, c'est au contraire 10 heures plus le double du numéro :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT nom,  MAKETIME(10, (ORD(LOWER(nom)) - 97) * 2, 0) as heure
    FROM ta_table
    WHERE MOD(ORD(nom) - 97, 4) = 0
    Il n'y a maintenant plus qu'à mettre en place le tout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ALTER TABLE ta_table ADD COLUMN Heure TIME FIRST ;
    UPDATE ta_table 
    SET Heure = MAKETIME(10, (ORD(LOWER(nom)) - 97) * 2, 0)
    WHERE MOD(ORD(nom) - 97, 4) = 0 ;

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Par défaut
    En modifiant ton code je réussi a obtenir une partie seulement de la solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT id,nom,prenom,  MAKETIME(10, ((id) - 1) * 2, 0) AS heure
    FROM test
    WHERE MOD((id) - 1, 4) = 0
    j'obtiens ceci avec des id incrémenter de 1 a la fois
    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
     
    id  nom  prenom  heure  
    1 Trépanier Jean 10:00:00 
    5 Rancourt Guy 10:08:00 
    9 Morin James Patrick 10:16:00 
    13 Paradis David 10:24:00 
    17 Rancourt Michel 10:32:00 
    21 Verrault Edouard 10:40:00 
    25 Verrault Edouard 10:48:00 
    29 Berger Gilles 10:56:00 
    33 Sauvageau Mario NULL 
    37 Sauvageau Mario NULL 
    41 Toussaint Guillaume NULL 
    45 Fortin Nicolas NULL 
    49 Toussaint Guillaume NULL 
    53 Paiement Jacques Sr NULL 
    57 Sauvageau Denis NULL 
    65 Bédard Jacques NULL 
    69 Pelletier Claude NULL 
    73 Mayville Jean NULL 
    77 Bélanger Jacques NULL 
    81 Pelletier Jean-Luc NULL 
    85 Marcotte Stephane NULL 
    89 Bouffard Bruno NULL 
    93 Bouffard Bruno NULL 
    97 Provencher Pierre NULL 
    101 Tremblay Gérald NULL 
    105 Laflamme Michel NULL 
    109 Vincent Gabriel NULL 
    113 Théberge René NULL 
    117 Coulombe Pierre NULL 
    121 Doyon Joël NULL
    Je voudrais que le temps continue ne pas arrêter après 1 heure

    En second lieu ma table n'a pas de id régulier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      Id  Nom  Prénom  Club  Circuit  Hdc  Cl  Tournoi  Cps  Pts  Total  
          979 Chevalier André Golf Le Grand Vallon Senior 15.0 BB Golf Bellechasse 0 0 0 
          792 St-Laurent André Golf Cap-Rouge Senior 14.7 BB Golf Bellechasse 0 0 0 
          748 Maltais Bernard Golf Des Pins Senior 11.2 BB Golf Bellechasse 0 0 0 
          616 Mulvey Charlie Golf Le St-Ferréol Senior 12.4 BB Golf Bellechasse 0 0 0 
          717 Beauchemin Claude Golf Orléans Senior 12.0 BB Golf Bellechasse 0 0 0 
          774 Charlebois Claude Golf Alpin Senior 12.0 BB Golf Bellechasse 0 0 0
    Alors comment je fait pour avoir le même résultat avec des ID irrégulier

    Merci beaucoup

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 292
    Par défaut
    Pourquoi tu me fais bosser sur des nom alphabétiques alors que tu as des ID numériques ?


  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 11
    Par défaut
    Toutes mes excuses, je ne connaissais pas l'importance du type de champs.

    Maintenant je vais fournir plus de détails que moins à l'avenir.

    Mais ton exercice m'a tout de même appris et c'est le but j'espère.

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 292
    Par défaut
    Bon, remettons l'ouvrage sur le métier. La première chose est effectivement de générer une numérotation régulière. Sous MySQL, il n'y a pas tellement de meilleur choix que de faire ça avec une "jointure triangulaire" (autrement dit, la moitié d'un produit cartésien, si tu le représentes par un carré). Le principe est que le n° d'un élément est le nombre d'éléments avant lui plus un, autrement dit plus lui-même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT COUNT(*) AS Numero, T1.*
    FROM ta_table T1
      INNER JOIN T2 ON T1.ID <= T2.ID
    GROUP BY T1.ID -- simplification propre à MySQL
    Passons maintenant au calcul des heures... Si l'on atteint 11h, ma bidouille avec MAKETIME ne marche effectivement plus, il faut trouver qqch de plus scalable. Par exemple en calculant le tout en secondes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SEC_TO_TIME(TIME_TO_SEC('10:00:00') + numero * 2 * 60)
    ce qui peut se simplifier en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SEC_TO_TIME(36000 + numero * 120)
    Donc si je recolle les morceaux dans un SELECT, ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT COUNT(*) AS Numero, SEC_TO_TIME(36000 + COUNT(*) * 120)
    FROM ta_table T1
      INNER JOIN ta_table T2 ON T1.ID <= T2.ID
    GROUP BY T1.ID 
    HAVING (numero MOD 4) = 0
    Et pour le passer en UPDATE :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    UPDATE ta_table T0
      INNER JOIN (
        SELECT T1.ID, COUNT(*) AS Numero, SEC_TO_TIME(36000 + COUNT(*) * 120) AS Heure
        FROM ta_table T1
          INNER JOIN ta_table T2 ON T1.ID <= T2.ID
        GROUP BY T1.ID 
        HAVING (numero MOD 4) = 0
    ) AS T3 ON T0.ID = T3.ID
    SET T0.Heure = T3.Heure
    A tester évidemment sur une copie de ta table...

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

Discussions similaires

  1. Jointure qui ne renvoie pas tous les enregistrements
    Par rayonx dans le forum Langage SQL
    Réponses: 12
    Dernier message: 19/07/2024, 09h33
  2. Recupération de tous les documents enregistrer
    Par peregna2007 dans le forum Configuration
    Réponses: 5
    Dernier message: 03/06/2011, 10h49
  3. Afficher tous les enregistrements d'une table
    Par bertrand_declerck dans le forum QuickReport
    Réponses: 2
    Dernier message: 08/07/2005, 08h35
  4. faire somme de tous les enregistrements identiques
    Par Keraccess dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/07/2005, 11h03
  5. Enlever tous les M&Mme des enregistrements
    Par marc olivier dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/07/2003, 12h24

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