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 :

effectuer une incrémentation par rapport à une ligne précédente après un tri


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2005
    Messages : 41
    Points : 28
    Points
    28
    Par défaut effectuer une incrémentation par rapport à une ligne précédente après un tri
    Bonjour à tous,

    J'aimerais savoir s'il était possible, en une requête SQL, d'affecter une colonne d'une table par un numéro d'ordre obtenu après avoir trié cette colonne dans l'ordre alphabétique ?

    Je m'explique !

    J'ai une table encapsulant des informations sur des élèves.
    Cette classe possède la colonne 'classe'.
    Chaque élève appartient à une classe.
    Lorsque je rajoute un élève (qui est arrivé au milieu d'une année) dans cette table, je dois retrouver son numéro d'ordre par rapport à l'ordre alphabétique des élèves de sa classe. Il faudra alors réaffecter chaque numéro d'ordre de chaque élève après l'insertion.

    Est-il possible de faire cela en une requête ?

    Merci d'avance pour vos conseils.

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    1) l'idée générale est qu'il est préférable de ne pas stocker des attributs calculables ; par exemple, on ne stocke pas un numéro d'ordre, notamment parce que ça oblige effectivement à re-calculer tous les numéros d'ordre à chaque insertion / suppression / mise à jour.

    Dans un but de normalisation, on va donc plutôt recalculer ce numéro d'ordre dynamiquement à chaque interrogation.

    2) A titre d'exemple, je vais supposer que ta tables Eleves contient les colonnes idEleve (clé primaire), Nom, Prenom et Classe.

    Le numéro d'ordre de chaque élève dans sa classe peut être par exemple mis en place à travers une vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE VIEW V_Classe AS
    SELECT E.Classe, COUNT(*) AS Numero, E.Nom, E.Prenom
    FROM Eleves E
      INNER JOIN Eleves E2 ON E.Classe = E2.Classe AND (E.Nom, E.Prenom) >= (E2.Nom, E.Prenom)
    GROUP BY E.IDeleve -- ou E.Classe, E.Nom, E.Prenom avec un autre SGBD
    Deux points supplémentaires pour expliquer la vue :

    3) l'idée générale est que le numéro d'ordre s'obtient en comptant le nombre d'élèves dans la classe qui sont situés avant dans l'ordre alphabétique.

    4) la syntaxe (Nom, Prenom) s'appelle un constructeur de ligne (row constructor) ; en gros, il permet de faire une comparaison sur plusieurs critères hiérarchisés. Dans l'exemple de la vue, c'est le nom qui sert pour la comparaison ; en cas d'égalité (donc, d'homonymie), c'est le prénom qui tranche.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2005
    Messages : 41
    Points : 28
    Points
    28
    Par défaut Merci
    Merci pour cette réponse. Il est vrai que je n'ai pas le réflex VIEW...
    Donc j'ai tenté cette méthode. D'abords sans création de vu. J'ai juste fait le SELECT que tu as écrit mais adapté à ma table. Voici le SELECT en question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT PS1.PS_classroom, COUNT(*) AS CR_order, PS1.PS_lastname, PS1.PS_firstname FROM person_PS PS1
    INNER JOIN person_PS PS2 ON (PS1.PS_classroom = PS2.PS_classroom) AND
                                (REPLACE(PS1.PS_lastname, ' ',''), REPLACE(PS1.PS_firstname, ' ','')) >= (REPLACE(PS2.PS_lastname, ' ',''), REPLACE(PS2.PS_firstname, ' ',''))
    WHERE PS1.PS_profession = 'student'
    GROUP BY PS1.PS_id
    ORDER BY CR_order;
    J'ai rajouté le REPLACE sinon l'ordre alphabétique tient compte des espaces dans les noms de famille.
    Le seul problème, c'est le numéro d'ordre. Je ne sais pas pourquoi mais il saute le numéro 7. Il passe de 6 à 8 !!!
    Pourtant tous les élèves sont bien triés !

    Si quelqu'un à une idée...

    Encore merci de m'avoir orienté vers les VIEW. Je trouve cela intéressant.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2005
    Messages : 41
    Points : 28
    Points
    28
    Par défaut
    Je viens de comprendre.
    Ma table person_PS contient à la fois les élèves mais aussi toutes les autres personnes, à savoir, les professeurs et le directeur. Pour distinguer ces personnes, j'ai un champ que j'ai nommé PS_profession.
    Pour retrouver le numéro d'ordre, il faut donc travailler dans une même classe mais aussi avec les personnes de même profession (ici les élèves).
    J'obtiens donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT COUNT(*) AS CR_order, PS1.PS_classroom, PS1.PS_lastname, PS1.PS_firstname FROM person_PS PS1
    INNER JOIN person_PS PS2 ON (PS1.PS_profession = PS2.PS_profession) AND (PS1.PS_classroom = PS2.PS_classroom) AND 
                                (REPLACE(PS1.PS_lastname, ' ',''), REPLACE(PS1.PS_firstname, ' ','')) >= (REPLACE(PS2.PS_lastname, ' ',''), REPLACE(PS2.PS_firstname, ' ',''))
    WHERE PS1.PS_profession = 'student'                      
    GROUP BY PS1.PS_id
    ORDER BY CR_order;
    Maintenant, cela semble fonctionner

    Encore merci pour tes suggestions.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 23/04/2008, 22h46
  2. Réponses: 2
    Dernier message: 05/06/2006, 17h51
  3. [JFrame] Placer une fenêtre par rapport à une autre
    Par Invité dans le forum Agents de placement/Fenêtres
    Réponses: 7
    Dernier message: 16/09/2005, 16h47
  4. Initialisation d'une colonne par rapport à une autre colonne
    Par jeromesco dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 13/04/2005, 17h15
  5. [JCombobox] modif d'une jcombobox par rapport à une autre
    Par The Wretched dans le forum Composants
    Réponses: 2
    Dernier message: 21/03/2005, 10h35

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