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
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
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
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;
SELECT * FROM
(SELECT * FROM MyTable
ORDER BY ID DESC
LIMIT 20) ilv
ORDER BY ID;
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.
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