IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Récupérer les 20 enregistrements les plus récents [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 530
    Par défaut Récupérer les 20 enregistrements les plus récents
    Bonjour à tous je cherche à récuperer dans une BDD les 20 enregistrements les plus récents et je me demande si la requête suivante va faire ce que j'attend ou juste me retourner les 20 premiers enregistrement trouvés dans la BDD et me les retourner classés par ordre de date ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $query_rsAffich="SELECT date, titre_small, titre_small_gb, text_small, text_small_gb FROM news ORDER BY date DESC LIMIT 20";
    Je pense que cela va me retourner les 20 premiers enregistrement trouvés dans la BDD et me les retourner classés par ordre de date mais je n'en suis pas sûr...

    Si c'est le cas, quelqu'un peut-il m'indiquer la bonne requête pour arriver à mes fins ?

    Merci d'avance pour vos réponses

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    Tu aurais pu le tester toi même mais le LIMIT s'applique bien après le ORDER BY.

    (enfin pour être précis, mysql trie jusqu'à avoir trouvé le nombre d'élements demandés)
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 530
    Par défaut
    Merci de ta réponse Sabotage,

    En fait le site est en cours de création et la BDD ne contient pas encore suffisamment d'enregistrements pour faire le test, c'est pourquoi je me suis permis de poser la question

    Merci encore pour ta réponse et bonne journée à tous

  4. #4
    Membre Expert
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 495
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 495
    Par défaut
    Citation Envoyé par Alexdezark Voir le message
    la BDD ne contient pas encore suffisamment d'enregistrements pour faire le test
    remplire moins de 20 (puisque visiblement il y en a quelques uns) enregistrement en mettant test1, test2 etc...et les supprimer apres est si difficile ?
    ca t'aurais eviter de perdre du temps a poster
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  5. #5
    Membre émérite Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Par défaut
    Citation Envoyé par sabotage Voir le message
    (enfin pour être précis, mysql trie jusqu'à avoir trouvé le nombre d'élements demandés)
    Pas tout à fait non.

    Le LIMIT est comme un masque qui s'applique en dernier, lorsque la requête à était exécutée.

    J'ai une table de communes avec environs 37000 lignes.
    Avec un :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM communes ORDER BY nom LIMIT 10
    La requête retourne bien 10 lignes.
    Mais lorsqu'on regarde le plan d'exécution, MySQL est bien allé chercher toutes les lignes de la tables, et donc seulement après a "masqué" toutes les lignes sauf les 10 premières.

  6. #6
    Membre Expert
    Avatar de Doksuri
    Profil pro
    Développeur Web
    Inscrit en
    Juin 2006
    Messages
    2 495
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 495
    Par défaut
    Citation Envoyé par Oishiiii Voir le message
    MySQL est bien allé chercher toutes les lignes de la tables, et donc seulement après a "masqué" toutes les lignes sauf les 10 premières.
    ca veut dire que faire une limite de 10 sur 10 000 occurences n'optimise en rien la requete ?
    plutot que de "recuperer" que 10 occurence, il en "masque" 9990 ?
    La forme des pyramides prouve que l'Homme a toujours tendance a en faire de moins en moins.

    Venez discuter sur le Chat de Développez !

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    530
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 530
    Par défaut
    ca t'aurais eviter de perdre du temps a poster
    En ce qui me concerne un Post sur ce forum n'est jamais une perte de temps...

    Si cela fait perdre du temps aux autres, là en effet il faut me le dire pour éviter de le reproduire

    Mais cela permet d'avoir des remarques et l'expérience des autres.

    Dans ce cas j'ai la réponse de Oishiiii qui m'interesse beaucoup :

    Cela signifie que ce n'est pas un gain de temps d'execution de faire ce type de requête.

    ce qui m'amène à demander : savez-vous s'il existe une façon de ne chercher que les 20 enregistrements les plus récents (champ date de type DATE) ou ceux dont le champ ID (auto-incrémenté) est le plus grand ?

    Merci d'avance pour vos réponses

  8. #8
    Membre émérite Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Par défaut
    Moi, je vous dis ça, mais je ne suis pas expert MySQL, si d'ailleurs quelqu'un connaissant le sujet pouvait apporter des précision, ce serait intéressant, mais j'ai peur que l'on ne soit pas sur le bon forum.

    Je constate simplement qu'en fait, MySQL va chercher toute les lignes qui serait retourner par la requête sans la clause LIMIT.
    Une fois le travail terminer, il applique un genre de "masque" pour n'afficher que les lignes correspondant à la clause LIMIT.

    Même sur une colonne indexée, la requête ne semble pas être optimisée.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM communes ORDER BY nom LIMIT 10;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    id 	select_type  table         type    possible_keys  key  key_len  ref  rows  Extra
    1 	SIMPLE 	     communes      index   NULL           nom    768  NULL  37385
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM communes ORDER BY id LIMIT 20000, 10
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra
    1 	SIMPLE 	communes 	index 	NULL 	PRIMARY 	4 	NULL 	35653
    Par contre logiquement :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM communes WHERE id BETWEEN 20000 AND 20010
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra
    1 	SIMPLE 	communes 	range 	PRIMARY 	PRIMARY 	4 	NULL 	11 	Using where
    Donc, j'en déduis que si l'on veux de meilleurs performances sur un gros tris, il faudrait ajouter une colonne à la table dédié au trie (mise à jour sur INSERT/DELETE/UPDATE), sur laquelle effectuer par exemple un BETWEEN utilisant l'index pour aller chercher les lignes voulues, ce que ne fait pas MySQL avec un "ORDER BY + LIMIT", non ?

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Par défaut
    En fait mysql lit l'intégralité de la base, et trie jusqu'a trouver les 20 demandés ; s'il ne lisait pas tout il ne pourrait evidemment pas trier.
    Mais il ne trie pas l'intégralité pour n'en afficher ensuite que 20.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 26/06/2008, 23h43
  2. Réponses: 5
    Dernier message: 02/05/2008, 15h28
  3. Ne conserver que les N enregistrement les plus récents.
    Par gomodo dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/01/2008, 19h46
  4. Réponses: 3
    Dernier message: 28/11/2003, 21h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo