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 :

récupérer la position d'un enregistrement


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 55
    Points : 28
    Points
    28
    Par défaut récupérer la position d'un enregistrement
    Bonjour à tous,
    voilà,
    je souhaite récupérer la position d'un enregistrement dans une table;
    exemple:
    l'enregistrement portant l'id 132 (champ auto-incrément) se trouve à la position 17 (suite à divers delete).
    Merci d'avance.
    Cordialement.

  2. #2
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Bonjour,

    Le terme de position n'est pas naturellement pertinent dans un SGBD.
    On peut comparer une table à un sac de billes : il n'existe pas de manière native d'ordonner les lignes.

    Par contre si dans une appli tu veux récupérer la position d'une ligne dans un resultset, il te suffit d'utiliser un compteur lors du parcours de ce resultset.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 55
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Maximilian
    Bonjour,

    Le terme de position n'est pas naturellement pertinent dans un SGBD.
    On peut comparer une table à un sac de billes : il n'existe pas de manière native d'ordonner les lignes.

    Par contre si dans une appli tu veux récupérer la position d'une ligne dans un resultset, il te suffit d'utiliser un compteur lors du parcours de ce resultset.
    Je connais cette solution mais cela nécéssite de récupérer un recordset de 23000 lignes puis de trouver la position de l'id!
    Cela aurait été plus simple avec une clause "...where id=121"
    la colonne des id est indexé naturellement car c'est un champ primaire en autoincrément!
    mais bon, s'il n'y a pas de solutions, je vais passer par une boucle!
    Merci pour ta réponse en tout cas.
    Cordialement.

  4. #4
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Je ne sais pas si c'est la question mais par exemple pour récupérer la 5è ligne de la table triée par id tu peux faire un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ... ORDER BY id LIMIT 4,1

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 55
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par Maximilian
    Je ne sais pas si c'est la question mais par exemple pour récupérer la 5è ligne de la table triée par id tu peux faire un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ... ORDER BY id LIMIT 4,1
    le LIMIT permet de récupérer l'enregistrement de la position désirée or ce que je cherche est la position d'un enregistrement par exemple:
    l'enregistrement avec l'id=5 se trouve à la position 3 dans la liste ci-dessous:
    article_id
    1
    2
    5
    donc comment connaître sa position sachant que l'on ne connait que son id ?
    cordialement !

  6. #6
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 911
    Points : 6 032
    Points
    6 032
    Par défaut
    Retour à la case départ et au sac de bille...

    Le SGBD se charge de ranger les données qu'on lui fournit, et il s'engage à les restituer à la demande.
    Le reste est son affaire.

    Dans cette boite noire, si tu insères séquentiellement et dans une table vide les id 1,2 et 5, le 5 sera au 3ème rang, mais les certitudes s'arrêtent là (et peut-être avant ).

    Si tu insères les id 1 à 4, puis tu supprimes 3 et 4, puis tu insères de 20 à 30, puis le 5, là il faut une boule de cristal

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 55
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par qi130
    Retour à la case départ et au sac de bille...

    Le SGBD se charge de ranger les données qu'on lui fournit, et il s'engage à les restituer à la demande.
    Le reste est son affaire.

    Dans cette boite noire, si tu insères séquentiellement et dans une table vide les id 1,2 et 5, le 5 sera au 3ème rang, mais les certitudes s'arrêtent là (et peut-être avant ).

    Si tu insères les id 1 à 4, puis tu supprimes 3 et 4, puis tu insères de 20 à 30, puis le 5, là il faut une boule de cristal
    Merci pour l'effort apporté à la réponse mais t'as peut-être raison, ma question est mauvaise.
    Cordialement

  8. #8
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 911
    Points : 6 032
    Points
    6 032
    Par défaut
    La question n'est pas nécessairement mauvaise, peut-être est-elle mal formulée ?

    Si je reprends ton 1er post, l'id 132 sera effectivement le 17ème sur une sélection ordonnée sur cette colonne, mais il peut se trouver n'importe où dans l'espace disque alloué à la base ou à la table.

    Si ton besoin est de connaître en live le rang de chaque tuple, je ne pense pas que le SGBD puisse te fournir ce service, sauf peut-être à fouiller les possibilités d'exploitation des index, en particulier celui que tu auras posé sur la colonne "id", mais ça reste de toute façon à ton initiative (programme).

  9. #9
    Membre habitué

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 145
    Points : 180
    Points
    180
    Par défaut
    Citation Envoyé par Maximilian
    Bonjour,

    Le terme de position n'est pas naturellement pertinent dans un SGBD.
    On peut comparer une table à un sac de billes : il n'existe pas de manière native d'ordonner les lignes.

    Par contre si dans une appli tu veux récupérer la position d'une ligne dans un resultset, il te suffit d'utiliser un compteur lors du parcours de ce resultset.
    Bonjour,

    Il ne faut pas généraliser ! Ce n'est parceque la solution n'est pas implémentée ou pas naturellement accessible sous MySQL qu'elle n'est pas "naturellement pertinente dans un SGBD"...

    La solution existe bel et bien sous d'autre SGBD comme Oracle, PostGres (et SQL Server il me semble). Sous Oracle par exemple, il suffit de récupérer la valeur de la pseudo-colonne ROWID dans un SELECT.

    Sous MySQL, malheureusement, la possibilité de récupérer le ROWID au travers du SQL ne semble pas être implémentée... Je me renseigne pour savoir si il est possible de créer une UDF qui ferais le taf...

    HTH,

  10. #10
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Je suis bien d'accord mais si ils sont uniques, rien ne dit que les rowid (ou oid/guid) forment une séquence dont l'ordre est celui de l'insertion des lignes dans la table.
    De plus ils sont gérés de façon très disparate d'un SGBD à l'autre (par exemple j'ai vu que les versions futures de Postgres n'inclueraient plus l'option with oids par défaut).

    A lire également : http://sqlpro.developpez.com/cours/sqlaz/erreurs/#L5

  11. #11
    Membre habitué

    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 145
    Points : 180
    Points
    180
    Par défaut
    Certe, l'ordre n'est pas important, l'identification de la position l'est, on est donc d'accord.

    Pour info, je viens de trouver ça, la possibilité d'utiliser _rowid pour identifier une ligne.


    Si une clé primaire (PRIMARY) ou unique (UNIQUE) est établit sur une seule colonne, et que cette colonne est de type entier, vous pouvez aussi faire référence à cette colonne sous le nom _rowid (nouveau en version 3.23.11).

    http://dev.mysql.com/doc/mysql/fr/create-table.html

  12. #12
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Citation Envoyé par ren0
    Certe, l'ordre n'est pas important, l'identification de la position l'est, on est donc d'accord.
    En fait qui dit position dit ordonnancement. Ce que je voulais dire c'est que par défaut les tables n'ont pas d'ordre cohérent. Donc dans l'absolu la position d'une ligne ne veut rien dire...

    Citation Envoyé par ren0
    Pour info, je viens de trouver ça, la possibilité d'utiliser _rowid pour identifier une ligne.


    Si une clé primaire (PRIMARY) ou unique (UNIQUE) est établit sur une seule colonne, et que cette colonne est de type entier, vous pouvez aussi faire référence à cette colonne sous le nom _rowid (nouveau en version 3.23.11).

    http://dev.mysql.com/doc/mysql/fr/create-table.html
    C'est juste un alias pour la clé primaire

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

Discussions similaires

  1. DBGrid récupérer les valeurs de l'enregistrement courant
    Par bob_sapp dans le forum Bases de données
    Réponses: 5
    Dernier message: 06/09/2014, 07h56
  2. [Plugin] Récupérer la position du curseur
    Par Amon dans le forum Eclipse Platform
    Réponses: 4
    Dernier message: 12/02/2009, 10h38
  3. Réponses: 1
    Dernier message: 16/09/2005, 14h07
  4. Réponses: 5
    Dernier message: 01/02/2005, 17h29
  5. Récupérer la position d'un enregistrement
    Par Hell dans le forum Requêtes
    Réponses: 6
    Dernier message: 10/09/2004, 19h14

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