Sélectionnez les N dernières lignes de MySQL


122

Je veux sélectionner les 50 dernières lignes de la base de données MySQL dans la colonne nommée id qui est la clé primaire . L'objectif est que les lignes soient triées par identifiant dans l' ordre ASC , c'est pourquoi cette requête ne fonctionne pas

SELECT 
    *
FROM
    `table`
ORDER BY id DESC
LIMIT 50;

Il est également remarquable que les lignes puissent être manipulées (supprimées) et c'est pourquoi la requête suivante ne fonctionne pas non plus

SELECT 
    *
FROM
    `table`
WHERE
    id > ((SELECT 
            MAX(id)
        FROM
            chat) - 50)
ORDER BY id ASC;

Question : Comment est-il possible de récupérer les N dernières lignes de la base de données MySQL qui peuvent être manipulées et être dans l'ordre ASC?

Réponses:


237

Vous pouvez le faire avec une sous-requête:

SELECT * FROM (
    SELECT * FROM table ORDER BY id DESC LIMIT 50
) sub
ORDER BY id ASC

Cela sélectionnera les 50 dernières lignes table, puis les classera par ordre croissant.


5
^ Pour info, je sais que cet article concerne MySQL, mais je voulais vous informer qu'en réponse au commentaire de @ DiegoDD ci-dessus, l'omission de la sélection externe et de l'alias ne semble pas fonctionner dans Postgres (9.3.5). J'obtiens une "Erreur: plusieurs clauses ORDER BY non autorisées". La réponse acceptée, cependant, fonctionne comme prévu dans Postgres
— allenwlee

Merci pour cela! Cette requête m'a aidé à résoudre mon problème. Je cherche cela depuis des heures
— Arshad

1
Comment puis-je appliquer cette requête avec JOINS?
— GYaN

@GYaN ajouter des jointures dans la sous-requête interne
— Sheikh Hamza

9
SELECT * FROM table ORDER BY id DESC,datechat desc LIMIT 50

Si vous avez un champ de date qui stocke la date (et l'heure) à laquelle le chat a été envoyé ou tout champ qui est rempli de manière incrémentielle (ordre par DESC) ou de manière désinscrémentale (ordre par ASC) par ligne, placez-le comme deuxième colonne sur dont les données doivent être ordonnées.

C'est ce qui a fonctionné pour moi !!!! j'espère que cela aidera !!!!


7
SELECT * FROM table ORDER BY id DESC LIMIT 50

enregistrer les ressources faire une requête, il n'est pas nécessaire de faire des requêtes imbriquées


1
Votre requête renverra les résultats en sens inverse (id décroissant). La requête de @ newfurniturey obtiendra les DERNIÈRES lignes insérées ( LIMITen id décroissant), et le résultat final aura des identifiants ascendants.
— Robin Kanters

1
Votre solution n'obtiendra pas les résultats dans le bon ordre au lieu de cela, elle les inversera, d'où la nécessité d'un autre ordre pour les remettre dans le bon ordre
— Cobra47

1
Mais ensuite, vous faites simplement un php array_reverse () ou tout autre équivalent dans le langage de script de votre choix. La base de données n'a pas besoin de faire ce travail.
— Joe

6
@Joe Il n'y a rien dans la question qui indique qu'un langage de script est utilisé, donc ce n'est pas une hypothèse sûre à faire.
— Nick Coons

La réponse attendue doit déjà être triée en utilisant uniquement la requête de base de données.
— d4ryl3

-2
select * from Table ORDER BY id LIMIT 30

Remarques: * iddoit être unique. * Vous pouvez contrôler le nombre de lignes renvoyées en remplaçant le 30dans la requête


1
Pouvez-vous expliquer votre solution? L'explication entre parenthèses semble être du code, mettez une phrase entière au-dessus / en dessous de votre code. Thanks
— deHaar
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.