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 :

Problème boucle while


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
    Mai 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 41
    Par défaut Problème boucle while
    Bonjour à tous,

    J'ai le programme suivant sur lequel j'aimerais mettre une boucle WHILE :

    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
     
    SELECT @taille := count(*) FROM boris;
     
    WHILE taille !=0 DO
     
    INSERT INTO  resultat_tri
    (SELECT xl3_m, xl3_s,
        count(*) AS occurrence
      FROM boris
      GROUP BY xl3_m, xl3_s
      ORDER BY occurrence DESC
      LIMIT 1);
     
    DELETE t1 
    FROM boris t1
    INNER JOIN resultat_tri t2 ON t1.xl3_m = t2.xl3_m2;
     
    SELECT @taille := count(*) FROM boris;
     
    END WHILE;
    en théorie, la variable taille sur laquelle porte ma condition d'arrêt décroit d'un pas à chaque tour (puisque je ne garde que le premier résultat du tri que je supprime). Du coup, elle est automatiquement décrémentée et le WHILE se termine au bout de sizeof(boris).

    Pb, ça ne fonctionne pas. Voyez-vous un problème avec ma syntaxe ?

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Pourquoi faire un WHILE ?

    Si je comprends bien, tu veux insérer dans la table resultat_tri les couples {xl3_m, xl3_s} ainsi que le nombre de leurs occurrences dans la table boris et triés par occurrence ; puis vider la table boris.

    Pourquoi ne pas faire le INSERT en une seule fois, suivi d'une requête DELETE ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO  resultat_tri
    SELECT xl3_m, xl3_s,
      count(*) AS occurrence
    FROM boris
    GROUP BY xl3_m, xl3_s
    ORDER BY COUNT(*) DESC;
     
    DELETE FROM boris;
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 41
    Par défaut
    en fait je veux trie les couples par occurrence et ne garde que celui de plus forte occurrence, en supprimant tous les couples où chaque membre du couple de plus forte occurrence apparaissait, d'où ma jointure.

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INNER JOIN resultat_tri t2 ON t1.xl3_m = t2.xl3_m2;
    La jointure du DELETE ne porte que sur xl3_m donc la requête va supprimer toutes les lignes du xl3_m inséré dans résultat_tri et pas seulement celui du couple inséré.

    Au fait, xl3_m2 existe t-elle ou est-ce une faute de frappe ?

    en fait je veux trier les couples par occurrence et ne garde que celui de plus forte occurrence, en supprimant tous les couples où chaque membre du couple de plus forte occurrence apparaissait, d'où ma jointure.
    Donc tu ne fais qu'un seul INSERT ? Celui du couple de plus forte occurrence ?
    L'INSERT ne devrait donc pas êtrer dans la boucle.

    Ou alors j'ai rien compris ou alors tu as mal expliqué !

    Un exemple de données ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 41
    Par défaut
    Effectivement, comme tu le signales au début de ton post, il manque bien un JOIN, la partie en question doit donc ressembler à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    DELETE t1 
    FROM boris t1
    INNER JOIN resultat_tri t2 ON t1.xl3_m = t2.xl3_m2;
    INNER JOIN resultat_tri t2 ON t1.xl3_s = t2.xl3_s2;
    (sous réserve que la syntaxe soit valide).

    J'ai bien créé xl3_m2, je craignais au début qu'il y ait un mélange potentiel en appelant dans 2 tables différentes une colonne portant le même nom.

    En fait, je cherche à obtenir une association unique de couples (xl3_m, xl3_s). Je garde donc le couple qui apparaît le plus fréquemment, et je supprime ceux où apparaît un élément du couple précédent, m'assurant ainsi de la condition de l'unicité.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    xl3_s     xl3_m    Occurrences
    1          A          5
    2          A          3
    1          B          3
    2          B          3
    Je garde doc le couple (1, A) de plus forte occurrence et supprime tous les "1" de la colonne xl3_s et tous les "A" de la colonne xl3_m.

    Je retrie par occurrence et j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    xl3_s     xl3_m    Occurrences
    2          B          3
    Du coup je garde le couple (2,B), supprime tous les "2" de la colonne xl3_s et tous les "B" de la colonne xl3_m et ainsi de suite.

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    OK alors ton idée de procédure semble bonne.

    Pour ta jointure, je pense que c'est plutôt comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DELETE t1 
    FROM boris t1
    INNER JOIN resultat_tri t2 ON t1.xl3_m = t2.xl3_m2
      OR t1.xl3_s = t2.xl3_s2;
    J'ai bien créé xl3_m2, je craignais au début qu'il y ait un mélange potentiel en appelant dans 2 tables différentes une colonne portant le même nom.
    Du moment que les colonnes de même nom sont préfixées par l'alias de la l'instance de la table, le SGBD s'y retrouvera sans problème.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. Problème boucle while
    Par Peedro dans le forum Langage
    Réponses: 4
    Dernier message: 07/10/2008, 14h09
  2. Problème boucle while
    Par chuko dans le forum C
    Réponses: 7
    Dernier message: 04/07/2008, 16h12
  3. Problème boucle while
    Par fred33 dans le forum Langage
    Réponses: 2
    Dernier message: 23/05/2008, 19h16
  4. [MySQL] Problème boucle WHILE
    Par Adlack dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/02/2007, 19h30
  5. Problème boucle while et evenement
    Par tse_tilky_moje_imja dans le forum Général Python
    Réponses: 2
    Dernier message: 30/03/2006, 18h11

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