web-dev-qa-db-fra.com

Sélectionnez les 20 dernières commandes en ordre croissant - PHP/MySQL

Ceci est ma structure de table 

MyTable
ID[P.K][auto increment]   TopicID   UID   Comment

Maintenant, je veux obtenir les 20 derniers commentaires pour un TopicID, mais il devrait être trié par ordre croissant!

[Tout comme Facebook montre par défaut les 20 derniers commentaires seulement]

Je recherche une version optimisée, je peux le faire avec une requête 2/3 et un tableau de tri php, mais je recherche une meilleure alternative

Sample Result with data

MyTable  
ID TopicID UID Comment  
1  1       10  AAAA   
2  1       11  BBBB  
3  1       10  CCCC  
4  1       10  dddd   
5  1       11  EEEE  
6  1       10  FFFF

Je veux obtenir les 3 derniers résultats pour un TopicID, le résultat devrait être 

4  1       10  dddd   
5  1       11  EEEE  
6  1       10  FFFF

et pas

6  1       10  FFFF  
5  1       11  EEEE  
4  1       10  dddd  
25
Sourav

Tout d'abord, sélectionnez les 20 dernières entrées. Ensuite, triez-les par ordre croissant. Vous pouvez facilement le faire en une seule requête (avec sous-requête):

select * from (
    select * from your_table order by id desc limit 20
) tmp order by tmp.id asc
38
binaryLV
SELECT  *
FROM    (
        SELECT  *
        FROM    mytable
        WHERE   topicid = $mytopicid
        ORDER BY
                id DESC
        LIMIT 20
        ) q
ORDER BY
        id

ou, plus efficacement,

(
SELECT  *
FROM    mytable
WHERE   topicid = $mytopicid
ORDER BY
        id DESC
LIMIT 20
)
ORDER BY
        id
3
Quassnoi

Cela devrait être l'expression la plus courte pour faire le travail:

    (select * from your_table order by id desc limit 20) order by id; 
2
Jpsy
 SELECT * FROM
   (SELECT * FROM MyTable
   ORDER BY ID DESC
   LIMIT 20) ilv
 ORDER BY ID;
1
symcbean

Je ne comprend pas vraiment ??

Quel est le problème avec un simple SELECT * FROM MyTable WHERE TopicID = 1 ORDER BY ID ASC LIMIT 20?

En passant, si vous affichez les dernières entrées (c'est-à-dire les plus récentes), vous souhaiterez utiliser DESC (décroissant), pas ASC. De plus, l'utilisation de l'ID étant très peu fiable, vous devriez avoir une colonne DATETIME qui stocke la date de saisie du commentaire.

EDIT: la réponse de binaryLV le fera correctement en utilisant une sous-requête. C'est la même requête que la mienne, DESC 'd, puis utilisée par ID.

0
Rudi Visser

Vous devez ajouter une colonne CommentDate et chaque fois que vous INSÉREZ un commentaire, utilisez NOW() ou GETDATE(), puis utilisez cette sélection:

SELECT Comment FROM MyTable WHERE TopicID=@ID ORDER BY CommentDate DESC, TopicID ASC LIMIT 20
0
Danpe