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 :

Obtenir le numéro d'une rangée


Sujet :

MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 193
    Points : 71
    Points
    71
    Par défaut Obtenir le numéro d'une rangée
    Bonjour,
    Pour obtenir le contenu d'une table "abcd" à partir de la rangée "$debut" sur "$quantite" de rangée je fais la requête SQL suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    query ('SELECT * FROM abcd ORDER BY Num ASC LIMIT '.$debut.','.$quantite.'');
    Comment faire pour faire l'inverse?
    Comment faire pour connaitre le numéro de la rangé FROM abcd WHERE Num="'.$_POST['Num'].'" par exemple?

    J'ai regardé sur Internet mais je ne trouve pas le bon mot clé qui me permet de trouver l'info et je tombe à chaque fois sur:
    $result->num_rows ou autre truc du genre... Mais ça, je connais déjà et ce n'est nullement ce que je cherche.

    Merci d'avance pour votre aide.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Une table d'une base de données n'est pas une feuille de tableur !

    Il n'y a pas de numéro de ligne. Une table est comme un sac. Rien ne garantit que les lignes retournées par la requête seront toujours dans le même ordre, sauf si vous spécifiez une clause ORDER BY.

    J'ose espérer que votre table a une clé primaire et que, si c'est une table issue d'une entité-type du modèle conceptuel de données, que cette clé primaire est une colonne d'identifiant de type entier et auto-incrémentée. Il est alors facile d'obtenir cet identifiant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT id
    FROM la_table
    WHERE une_colonne = 'une_valeur'
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 régulier
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 193
    Points : 71
    Points
    71
    Par défaut
    Merci Cinephil pour votre réponse.

    Oui, ma table a une clé primaire qui correspond à ma colonne "Num" qui est auto-incrémentée.

    Il ne me reste plus qu'à essayer vos recommandations et je reviendrai vers vous pour vous donner des nouvelles.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Alors tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT -- les colonnes nécessaires et pas étoile !
    FROM la_table
    WHERE num = :num
    Attention aux injections SQL ! Ne pas utiliser directement $_POST['num'] dans la requête ni les commandes mysql_ qui sont obsolètes mais préférer mysqli_ ou PDO.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 régulier
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 193
    Points : 71
    Points
    71
    Par défaut
    Re-bonjour CinePhil,

    En relisant avec attention vos réponses, je réalise que mon souhait n'est peut-être pas possible eu égard votre remarque qui dit que SQl est un "sac" et non un tableur.

    Je vais reformuler ma question avec un exemple illustré par une photo d'écran de ma table sur phpMyAdmin.
    Table très simple de 2 colonnes: La première nommée "Num" en INT auto-incrémentée et la 2e nommée "Mail" en VARCHAR.
    Dans la première photo, on voit 4 rangée avec: 1-Olivier, 2-Susie, 3-Paul et 4-Anne.
    Nom : Table1.jpg
Affichages : 500
Taille : 13,2 Ko

    Seulement voilà Susie s'est retirée de cette liste et il ne reste plus que: 1-Olivier, 3-Paul et 4-Annne comme sur cette 2e photo d'écran.
    Nom : Table2.jpg
Affichages : 460
Taille : 10,6 Ko

    Evidement, les numéros auto-incrémentés ne changent pas. Mais 3-Paul se retrouve sur la 2eme rangée et 4-Anne sur la 3eme rangée...

    J'aimerai donc savoir quelle requête SQL faire pour savoir à quelle rangée se trouve Paul, par exemple.
    Est-ce possible? Quelle serait la syntaxe de cette requête?

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Evidement, les numéros auto-incrémentés ne changent pas. Mais 3-Paul se retrouve sur la 2eme rangée et 4-Anne sur la 3eme rangée...

    J'aimerai donc savoir quelle requête SQL faire pour savoir à quelle rangée se trouve Paul, par exemple.
    Est-ce possible? Quelle serait la syntaxe de cette requête?
    Pas beaucoup de temps pour répondre...
    Si MySQL était moins nul et connaissait les CTE, il aurait les utils pour faire ça plus facilement.

    Le principe est de créer une vue avec une requête SELECT ... ORDER BY et en y ajoutant une colonne virtuelle (nommée par exemple "ordre" qui s'incrémente. J'ai déjà vu ça sur le forum mais ne l'ayant jamais fait moi-même, je passe la main aux spécialistes.

    Cherche peut-être"MySQL OVER PARTITION".
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  7. #7
    Membre régulier
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 193
    Points : 71
    Points
    71
    Par défaut
    Merci CinePhil pour votre réponse et j'irai chercher avec vos mots clés.
    En attendant, à vous les spécialistes, si vous connaissez une solution à mon souhait, je suis évidement preneur et cela m'évitera de chercher pendant de longues heures sur Internet.
    Merci d'avance.

  8. #8
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut La méthode bourrin...
    Bonsoir,


    Avec MySQL, j’ai l’impression qu’il reste la méthode bourrin, c'est-à-dire utiliser un curseur dans une procédure, comme il y a 40 ans...

    Une table :

    
    CREATE TABLE T
    (
            Num    INTEGER                 NOT NULL
          , Mail   VARCHAR(32)             NOT NULL
        , CONSTRAINT T_PK PRIMARY KEY (Num)      
    ) ;
    
    
    La procédure avé le curseur :

    
    DROP PROCEDURE IF EXISTS CursonsJoyeusement ;
    
    DELIMITER GO
    
    CREATE PROCEDURE CursonsJoyeusement
    (
       IN Gazier VARCHAR(32),
       OUT Numero INT
    )
    
    BEGIN
        DECLARE Fini INTEGER DEFAULT FALSE ;
        DECLARE theKount INTEGER ;
        DECLARE theGazier VARCHAR(32) ;
    
        DECLARE  C1 CURSOR FOR 
            SELECT Mail FROM T ORDER BY Num ;
     
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET Fini = TRUE ;
        
        SET theKount = (SELECT COUNT(*) FROM T) ;
            
        SET Numero = 1 ;
    
        OPEN C1 ;
        
    BOUCLE: LOOP
        
        FETCH C1 INTO theGazier ;
        
        IF Fini OR theGazier = Gazier THEN 
            LEAVE BOUCLE ;
        END IF ;
        
        SET Numero = Numero + 1 ;
    
    END LOOP ;
    
        IF Numero > theKount   THEN 
            SET Numero = 0  ;    --  Si pas trouvé
        END IF ;
        
        CLOSE C1 ;
    END
    
    GO
    
    DELIMITER  ;
    
    SELECT * FROM T ;
    
    SET @Gazier = 'Paul' ;
    
    CALL CursonsJoyeusement (@Gazier, @Numero) ;
    
    SELECT 'numéro de ligne = ' , @Numero
    
    
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  9. #9
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Il y a en effet une "technique" bien MySQLesque de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    set @cpt = 0;
    	select num,mail ,@cpt := @cpt + 1  as c
    	from abcd

    Ou la version plus classique, mais attention aux (mauvaises) performances sur les grosses tables

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT a.num, a.mail, COUNT(*)
    FROM abcd a
    INNER JOIN abcd b
    	ON b.num <= a.num
    GROUP BY a.num, a.mail

  10. #10
    Membre régulier
    Homme Profil pro
    Apprenti perpétuel
    Inscrit en
    Novembre 2012
    Messages
    193
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Apprenti perpétuel

    Informations forums :
    Inscription : Novembre 2012
    Messages : 193
    Points : 71
    Points
    71
    Par défaut
    Désolé pour cette réponse si tardive mais j'avais des trucs sur le feu...
    Suite à la longue explication de fsmrel, mon coté paresseux m'a poussé à contourner le problème en créant 2 tables identiques: L'originale et sa copie. Et les membres ne peuvent disparaitre que de la copie et je compte sur l'originale.

    Maintenant que je vois une deuxième réponse plus courte, je l'essayerai un jour.

    Merci.
    H Olivier Dauxais.

Discussions similaires

  1. obtenir le résultat d'une requête SQL dans un range
    Par mah.ngaz dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 25/04/2013, 11h59
  2. Réponses: 22
    Dernier message: 03/05/2011, 14h52
  3. [VB.NET] Obtenir le numéro de la semaine d'une date
    Par alain&&thomas dans le forum Windows Forms
    Réponses: 9
    Dernier message: 07/09/2009, 17h54
  4. obtenir le numéro de semaine d'une date et vis-et-versa ?
    Par clavier12AZQSWX dans le forum Flash/Flex
    Réponses: 1
    Dernier message: 18/08/2009, 18h16
  5. Réponses: 14
    Dernier message: 01/06/2006, 17h32

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