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

Langage SQL Discussion :

Requête sql pour récupérer l'avant dernier enregistrement


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mars 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2015
    Messages : 20
    Points : 4
    Points
    4
    Par défaut Requête sql pour récupérer l'avant dernier enregistrement
    Bonjour,

    J'aimerais savoir s'il vous plait quelle requête peut-on écrire pour sélectionner l'avant dernier élément enregistrer dans une table.

    Merci.

  2. #2
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 239
    Points : 313
    Points
    313
    Par défaut
    Bonjour Papidjo1456,

    De mon point de vue, tout dépend du moteur de base de données que vous utilisez.

    Pouvez-vous en dire plus à ce sujet ?

  3. #3
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 084
    Points : 38 381
    Points
    38 381
    Billets dans le blog
    9
    Par défaut
    Ca dépend aussi et surtout de la présence d'une colonne d'horodatage, sans laquelle ce n'est pas possible (sauf utilisation de tables temporelles, mais c'est spécifique je crois à SQL Server 2016)

  4. #4
    Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mars 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2015
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par jcdentons Voir le message
    Bonjour Papidjo1456,

    De mon point de vue, tout dépend du moteur de base de données que vous utilisez.

    Pouvez-vous en dire plus à ce sujet ?
    Re-bonjour,

    J'utilise mysql pour mes requêtes et j'ai une table dans ma base de données avec un champ id (clé primaire) pour lequel je souhaiterais récupérer l'avant dernier enregistrement.

    J'ai vu cette astuce sur un site web que j'ai testé mais ça n'a pas fonctionné. Je pense bien que j'ai mal structuré le code en utilisant l'astuce.

    ORDER BY id (ASC) LIMIT (0,)1 : donne la première (avec l'id le moins élevé)
    ORDER BY id DESC LIMIT (0,)1 : donne la dernière (avec l'id le plus élevé)
    ORDER BY id (ASC) LIMIT 1,1 : donne la deuxième avec l'id le moins élevé
    ORDER BY id DESC LIMIT 1,1 : donne l'avant dernière (la 2^e avec l'id le plus élevé)
    ORDER BY id (ASC) LIMIT 2,1 : donne la troisième avec l'id le moins élevé
    ORDER BY id DESC LIMIT 2,1 : donne l'antépénultième (la 3^e avec l'id le plus élevé)


    Merci.

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 778
    Points
    30 778
    Par défaut
    Comme l'a dit Escartefigue, il faut que la table possède une colonne permettant d'identifier de manière certaine l'ordre de création des lignes.

    Après pour l'identifier, c'est relativement simple :
    C'est celui pour lequel il n'y a pas plus d'une ligne dont l'identifiant ordonné est supérieur à celui-ci et inférieur au dernier
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mars 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2015
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Comme l'a dit Escartefigue, il faut que la table possède une colonne permettant d'identifier de manière certaine l'ordre de création des lignes.
    Salut,
    la colonne id est de type entier, je peux récupérer le dernier élément de la table avec le code suivant:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT * FROM ma_table ORDER BY ID DESC LIMIT 0,1
    Mais comment dois-je procéder pour récupérer l'avant dernier?

    Merci.

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 084
    Points : 38 381
    Points
    38 381
    Billets dans le blog
    9
    Par défaut
    Bonsoir,

    Si l'id est un identifiant attribué par le SGBD, il ne faut en aucun cas l'utiliser pour connaitre l'ordre d'insertion

    C'est tentant, je le reconnais, car la technique semble fonctionner quand la table est récente et qu'il y a eu peu d'insertions, mais...
    ... mais les id sont distribués par paquets aux différentes applications qui ont besoin d'insérer, or rien ne garantit que l'identifiant 1020 par exemple, soit commité par la transaction qui a recu cette valeur par le SGBD, avant l'identifiant 1028 pourtant de valeur supérieure.

    Il peut y avoir d'autres causes de rangement différents des id par rapport au chronos en fonctions du SGBD et du paramétrage de l'identifiant (+ ou - riche selon les SGBD)

    C'est pourquoi seule une colonne de type timestamp, voire même un timestamp + un chrono (un timestamp n'étant pas une garantie de valeur unique), permet de connaitre la chronologie d'insertion
    Encore une fois, sauf avec les tables temporelles, mais qui n'existent pas pour tous les SGBD, loin s'en faut.

  8. #8
    Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mars 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2015
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    Salut,
    Merci de m'avoir guidé, j'ai trouvé la solution à mon problème avec la requête suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $reqcandt = $bdd->query("SELECT * FROM ma_table ORDER BY id DESC LIMIT 1,1 ");
    Merci.

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 084
    Points : 38 381
    Points
    38 381
    Billets dans le blog
    9
    Par défaut
    Encore une fois, si l'id est attribué par le SGBD, par exemple colonne de type auto-incrément, cette requête ne vous garantit en rien un résultat fiable !

  10. #10
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 778
    Points
    30 778
    Par défaut
    Et en plus elle retourne le plus grand id, pas l'avant-dernier
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  11. #11
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 736
    Points : 52 448
    Points
    52 448
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Ca dépend aussi et surtout de la présence d'une colonne d'horodatage, sans laquelle ce n'est pas possible (sauf utilisation de tables temporelles, mais c'est spécifique je crois à SQL Server 2016)
    Non, cela fait partie de la norme SQL 2011, mais peu de SGBDR l'on implémenté (DB2 oui).

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  12. #12
    Candidat au Club
    Homme Profil pro
    Webdesigner
    Inscrit en
    Mars 2015
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2015
    Messages : 20
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    j'utilise un champ timestamp dans la base de données créé avec la fonction php date(''U'') qui me donne une valeur numérique. Comment puis-je l'utiliser pour afficher mes élément dans l'ordre chronologique?

    En fait ma table contient des articles (image, titre, contenu, date, timestamp) et les contenus doivent être affichés sur la page web sur différents blocs distincts mais par ordre d'arrivé c'est-à-dire que le dernier article se met en vedette et les autres changent de bloc au fure et à mesure.
    Merci de m'apporter votre aide.

  13. #13
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 084
    Points : 38 381
    Points
    38 381
    Billets dans le blog
    9
    Par défaut
    Voici un exemple de requete pour récupérer le plus récent (MaCol3 étant la colonne d'horodatage)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
       SELECT  MaCol1
             , MaCol2                        
             , MaCol3
       FROM   MaTable MAIN                     
       WHERE NOT EXISTS                      
            (SELECT 1                        
             FROM   MaTable SUBQ                
             WHERE  SUBQ.MaCol1=MAIN.MaCol1
               AND  SUBQ.MaCol2=MAIN.MaCol2  
               AND  SUBQ.MaCol3>MAIN.MaCol3) 
       ORDER BY MaCol1, MaCol2

    Et un exemple pour récupérer le plus récent -1

    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
     SELECT Col1, Col2, Col3                  
     FROM (                                
           SELECT  MaCol1       AS Col1           
                 , MaCol2       AS Col2          
                 , MAX(MaCol3)  AS Col3           
           FROM   MaTable MAIN                     
           WHERE MaCol3  <                        
                (SELECT MAX(MaCol3)              
                 FROM   MaTable SUBQ                
                 WHERE  SUBQ.MaCol1=MAIN.MaCol1
                   AND  SUBQ.MaCol2=MAIN.MaCol2  
                   AND  SUBQ.MaCol3>MAIN.MaCol3) 
           GROUP BY MaCol1, MACol2 
          )                                     
     ORDER BY Col1, Col2
    La solution pour trouver l'avant dernier est un peu compliquée, MySQL oblige, avec un autre SGBD, une fonction de fenêtrage eut été beaucoup plus simple

Discussions similaires

  1. Requête SQL pour récupérer un tableau Excel
    Par gzeus dans le forum Excel
    Réponses: 1
    Dernier message: 22/04/2011, 18h45
  2. requête SQl pour récupérer les noms des tables
    Par taher84 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 16/07/2010, 23h07
  3. [MySQL] Requête SQL pour récupérer variable tableau
    Par Baka59 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 16/10/2008, 20h06
  4. [MySQL] Requêtes différentes pour récupérer un ou plusieurs enregistrements
    Par Dendrite dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 11/06/2008, 18h34
  5. [MySQL] Requête pour récupérer les 5 derniers enregistrement dans l'ordre croissant
    Par Jonathan.b dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 07/01/2008, 10h50

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