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 :

afficher les 3 dernieres lignes d'une table sans passer par order by


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 67
    Points : 40
    Points
    40
    Par défaut afficher les 3 dernieres lignes d'une table sans passer par order by
    Bonsoir a tous.

    J' ai un petit probleme dans le cadre d'un projet, j'ai besoin d 'une requete sql permettant d'afficher les deux dernieres lignes d'une table.

    Par exemple:

    id nom table personne
    1 olivier
    2 jean
    3 khalil
    4 youssef
    5 goku

    je veux dans ce cas par exemple les noms :
    khalil, youssef et goku.

    je sais que la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select nom from personne LIMIT 3
    affiche les 3 premiers noms de la table personne.
    Moi j'aimerai y afficher les 3 dernieres. Faut il faire un traitement qui ressemble
    au precedent.

    je precise que je veux faire sans passer par "order by".
    Je veux veux recuperer les 3 dernieres de ce tableau tel quel.

    J'ai regardé sur le net mais je n'ais pas vraiment trouvé.
    Si quelqu'un peut m' aider ce serait tres sympa.

    Merci d'avance.
    Cordialement.

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Points : 562
    Points
    562
    Par défaut
    Pour obtenir les 3 derniers enregistrements, le plus simple est de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT nom
    FROM personne
    GROUP BY id DESC
    LIMIT 3
    je veux faire sans passer par "order by".
    Pourquoi ne peux-tu pas utiliser ORDER BY ?

    Pour faire la requête sans, tu peux te servir des jointures.
    En effet, le dernier enregistrement est celui pour lequel aucun autre enregistrement ne se situe après.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT a.nom
    FROM personne a
    LEFT OUTER JOIN personne b ON b.id>a.id
    GROUP BY a.id
    HAVING count(b.id)>=3
    Cette requête sélectionne les 3 derniers enregistrements sans utiliser ORDER BY, mais elle utilise GROUP BY.
    On peut éviter d'utiliser GROUP BY en le remplaçant par des jointures.

  3. #3
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Citation Envoyé par mazizou
    je precise que je veux faire sans passer par "order by".
    Je veux veux recuperer les 3 dernieres de ce tableau tel quel.
    Les premiers ou derniers n'ont pas de sens en base de données puisque les données peuvent avoir été insérées dans un ordre complètement aléatoire.

    C'est toujours premier ou dernier , ou n, par rapport à une colonne, à quelque chose de déterminé. Dans ton cas l'identifiant id par exemple.

    Voici une piste sans order mais qui revient au même car basé sur les identifiants, comme l'est l'autre solution au dessus de mon message basé lui aussi sur les identifiants.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select * from personne
    where id in
    (select max(id) from personne
    union 
    select max(id)-1 from personne
    union 
    select max(id)-2 from personne
    )
    Tu peux essayer de remplacer la colonne id par le mot clé rownum (pseudo-colonne) mais cela n'existe pas dans tout les SGBDR.

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 67
    Points : 40
    Points
    40
    Par défaut
    Bonsoir.

    Tout d'abord je tenais a vous remercier tous les deux de m'avoir repondu et pour votre aide.

    Je vais essayer de mieux expliquer mon probleme.

    En ce moment je travail sur une application struts qui consiste a ce qu'un utilisateur puisse uploader une image, une fois celle ci uploadé elle est rajoutée en base.

    Dans mon cas une image est constituée d'une url.

    Donc je stocke en base un id ainsi qu'une url pour mon objet image.
    J'ai constaté sur postgreSQL que des que je rajoute un objet en base celui ci se rajoute a la suite.

    Or une question de mon application est d'afficher les 3 dernieres images uploadées et donc les 3 derniers images rajoutées en base.

    Donc voila pourquoi je veux les 3 derniers stockés en base.

    Le probleme est que si j'utilise order by url par exemple il va me stocké mes url dans l'ordre alphabetique, ce qui ne correspond avec ce que je veux.

    Moi j'ai besoin de recuperer les 3 derniers objets stockés en base et comme a chaque objet celui ci est rajouté a la suite j'avais pensé a recuperer ces 3 derniers objets.

    Par contre j'ai essayer vos differentes requetes mais j'ai l'impression qu'elle ne fonctionne pas ou ces peut etre moi qui m'y prend mal.

    Pour les exemple de jeremya :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT a.url FROM image a LEFT OUTER JOIN image b ON b.id>a.id GROUP BY a.id HAVING count(b.id)>=3
    j'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ERROR:  column "a.url" must appear in the GROUP BY clause or be used in an aggregate function
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT url FROM image GROUP BY id desc LIMIT 3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ERROR:  syntax error at or near "desc" at character 35
    Pour l'exemple de phili_b :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT * FROM image WHERE id IN 
    (SELECT max(id) FROM image union 
    SELECT max(id)-1 FROM image union 
    SELECT max(id)-2 FROM image )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    je n'obtient qu'une ligne qui ne fait en plus pas partie des 3 derniers objets
    le probleme est que je ne m'y connais pas trop en sql, donc c'est peut etre moi qui fait n'importe quoi.
    Si vous avez des solutions a me proposer je serai toujours preneur.

    Merci d'avance et bonne nuit.

  5. #5
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    et par la date et l'heure?

    puisque c'est de ça qu'il s'agit on dirait ?

  6. #6
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Points : 562
    Points
    562
    Par défaut
    Si on récapitule, tu as une application où des utilisateurs peuvent uploader des images. Ces images sont identifiées par une URL.

    Je suppose que tu as 2 tables, une table utilisateur et une table image :
    • utilisateur ( id, nom)
    • image ( id, url, date , id_utilisateur )


    Le champ date de la table image indique la date et l'heure d'upload du fichier image.
    Le champ id de la table image est probablement un champ auto-incrémenté.

    Pour obtenir les derniers enregistrements, tu as 2 possibilités :
    1. se servir du champ date
      Les derniers enregistrements sont ceux dont la date est la plus récente
    2. se servir du champ id de la table image
      Si le champ id est un champ auto-incrémenté,


    le probleme est que je ne m'y connais pas trop en sql
    Pour mieux connaître le SQL, tu peux consulter la documentation de ton SGBDR et consulter différents tutoriaux.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 67
    Points : 40
    Points
    40
    Par défaut
    Merci beaucoup pour votre aide.

    Je pense que vous avez tous les deux raisons, la meilleur chose est d'introduire une colonne date à ma table et de m'en servir pour recuperer 3 dernieres url.

    Je vais essayer ca.

    @+

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Je ne suis pas sûr que mazizou comprènne bien à quoi s'applique le order by : tu peux ordonner sur ce que tu veux (date, url,... n'importe quelle colonne de ta table).
    Si elle est bien faite, tu as un identifiant unique qui est un numéro auto incrémenté.
    En ordonnant sur ce champs (order by ID)et en prenant les trois (limit 3) derniers (DESC) tu as :
    "les trois derniers insérés dans ta base" mais il est vrai dans un ordre décroissant (goku, youssef et khalil dans ton exemple)
    C'est dans l'affichage de ta page qu'il te faudra ensuite les afficher dans l'ordre que tu veux. Une boucle ou autre doit te permettra cela, mais je sais pas en quoi tu programme et si c'est un language que je connais.

Discussions similaires

  1. Réponses: 12
    Dernier message: 04/12/2013, 21h22
  2. [AC-2007] Requête Ajoût avec donnée d'une table, sans passer par le SQL
    Par charlhub dans le forum Access
    Réponses: 4
    Dernier message: 08/01/2012, 19h49
  3. [AC-2003] Afficher les 100 derniers enregistrements d'une table
    Par Evolvana dans le forum VBA Access
    Réponses: 3
    Dernier message: 03/08/2011, 15h47
  4. récupérer les dernieres lignes d'une table
    Par steave dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/04/2008, 12h26
  5. Réponses: 4
    Dernier message: 05/12/2007, 19h06

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