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?

nanobash
la source

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.

nouveau meuble
la source
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 !!!!

aidonsnous
la source
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

Bourdonner
la source
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

Darshan
la source
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