MYSQL : SELECT les 30 derniers enregistrements

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : MYSQL : SELECT les 30 derniers enregistrements

par albat » 07 sept. 2005, 13:31

Ok. Je pensais que MySQL avait un comportement particulier pour le HAVING .
Pas à ma connaissance.
Il y a avec MySQL une particularité intéressante pour le SELECT count(*)
mais qui ne s'applique que pour les tables MyISAM (pas les InnoDB).
Par contre ORDER BY nécéssite aussi de retraité le resultat.
Cependant cette effet peut être annuler (dans certains cas) par l'utilisation pertinente d'un index.
Tout à fait, mais le résultat à retraiter ne fait que 30 lignes,
et sachant que la donnée à trier est un numérique indexé,
ça va pas être bien dur... :lol:

par Augure » 07 sept. 2005, 12:12

Ok. Je pensais que MySQL avait un comportement particulier pour le HAVING .

Par contre ORDER BY nécéssite aussi de retraité le resultat. Cependant cette effet peut être annuler (dans certains cas) par l'utilisation pertinente d'un index.

Ta solution avec un sous Select me semble plus pertinente que la solution avec jointure.
Solution HAVING : Parcourt de toute la table pour trouver id max, puis reparcourt pour trouver id < idmax-30, puis tri de 30 ligne. Cette solution ne peut utiliser l'index.
Solution SubQuery : Parcourt de toute la table (ou index + rapide), puis tri de 30 ligne DESC , puis tri ASC
Solution Jointure ; Parcourt de toute la table (ou index + rapide), puis tri DESC, puis pour chaque ligne jointure (si pas index c'est pas top la), puis tri ASC


PS pour SUG : Vu ta volumétrie, prend l'ordre SQL qui te semble le plus simple. Il n'y aura pas de différence notable de performance.
[/b]

par albat » 07 sept. 2005, 11:37

D'ailleurs, puisque je parle d'optimisation...

:idea: Ne pas oublier qu'une jointure est souvent (toujours ?) plus performante qu'une requête imbriquée (ou sous-requête).
SELECT   T1.id
FROM     tchat T1 RIGHT JOIN ( SELECT   id
                               FROM     tchat
                               ORDER BY id DESC
                               LIMIT    0, 30 ) T2
                  ON T1.id = T2.id
ORDER BY T1.id
:!: NB : Je n'ai pas testé, c'est juste une piste.

par albat » 07 sept. 2005, 11:30

le HAVING est une clause SQL très lourde car elle nécessite un double traitement des résultats de ta requête.

Il est certain que sur une requête qui renvoie 10 lignes, ce n'est pas bien gênant
mais si, pour remonter ces 10 lignes, tu as dû interroger une table
qui contient plusieurs milliers d'enregistrements, tu vas faire ramer ta base !

Il y a cependant certains cas où il est difficile de s'en passer.
C'est pour cela que le HAVING existe malgré ses inconvénients en terme de performance.

Mais il vaut mieux procéder autrement chaque fois que c'est possible.

Le SQL doit non seulement donner des résultats exacts (c'est vrai que c'est plus sympa !) :langue:
mais il doit aussi être optimisé ! ;)

par Augure » 07 sept. 2005, 11:24

Pourquoi préférable au HAVING ?

(C'est pas une question à polémique. J'ai aucun souci pour changer ma façon de travailler s'il y a plus efficace) :wink:

par albat » 06 sept. 2005, 19:39

Un peu lourd, mais quand même préférable au Having...
SELECT   id
FROM     ( SELECT   id
           FROM     tchat
           ORDER BY id DESC
           LIMIT    0, 30)
ORDER BY id

par SuG » 06 sept. 2005, 19:26

bon désolé si apparement ma question etait trop dure, je pense que j'ai trop ecrit pour rien

ma question est vraiment simple et la suivante :

Comment faire pour selectionner les 30 derniers enregistrements d'une table MYSQL, sans inverser les enregistrements ?

Les inverser serait pas top, parceque je veux les afficher donc je devrais les ré ré inverser...

Augure dsl c marche pas ca selectionne tout

merci quand meme pour le temps que vous avez pris

par albat » 06 sept. 2005, 18:25

(La solution qui consisterait à inverser la selection et prendre les 30 premiers est trop compliqué ici )
J'avais lu, mais je ne vois pas la contre-indication. :-k

par iclo » 06 sept. 2005, 18:24

C gentil de repondre à ma question mais merci de la lire en entier
(La solution qui consisterait à inverser la selection et prendre les 30 premiers est trop compliqué ici )
Pourquoi est-ce trop compliqué ? Donnes nous des détails si tu veux qu'on puisse te proposer une solution...

par Augure » 06 sept. 2005, 18:24

Ta question est pas trés claire.

Je suppose que tu veux les 30 derniers mais dans l'ordre ?

Si j'ai bien vu bien essayes ceci
Select id, col1 , col2 , col3
From tchat
Group By id, col1 , col2 , col3
Having id > max(id) - 30
Order by id

par SuG » 06 sept. 2005, 18:11

C gentil de repondre à ma question mais merci de la lire en entier
(La solution qui consisterait à inverser la selection et prendre les 30 premiers est trop compliqué ici )

par albat » 06 sept. 2005, 17:43

SELECT   id
FROM     tchat
ORDER BY id DESC
LIMIT    0, 30

MYSQL : SELECT les 30 derniers enregistrements

par SuG » 06 sept. 2005, 17:16

Bonjour j'ai une table ' tchat' qui comporte plus de 1500 lignes

J'aimerais en afficher les 30 dernières ( celles qui ont le plus grand 'id' )
mais pour cela je suis d'abord obligé de faire une premiere requete pour calculer max, le nombre total de lignes

puis une 2eme requete à peu pres comme ca :
SELECT * FROM tchat ORDER BY id LIMIT $max-30, $max

Y a til une commande plus simple dans MySQL qui permet de prendre les X dernieres lignes d'une table ?

(La solution qui consisterait à inverser la selection et prendre les 30 premiers est trop compliqué ici )

D'avance merci beaucoup