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 :

Affichage requête aléatoire paginé


Sujet :

PHP & Base de données

  1. #1
    Membre du Club Avatar de bodysplash007
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 154
    Points : 58
    Points
    58
    Par défaut Affichage requête aléatoire paginé
    Bonjour,
    Voila j'aimerai afficher le resultat d'une requete de manière aléatoire. Je m'explique, lorsque j'affiche ma requete qu'elle me l'affiche jamais déux fois dans le même ordre.

    Est ce possible?? j'ai mené ma petite enquete mais j'ai trouve que la focntion rand en PHP mais c'est pour des nombres.

    Si quelqu'un a une idée, il est le bien venu.

    Merci a tous ceux qui répondront

  2. #2
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Bonjour,

    Quand tu demandes a ce que le résultat ne soit jamais affiché deux fois dans le meme ordre, c'est deux fois de suite? ou vraiment jamais dans le meme ordre?

    Tu pourrais commencer par récupérer le résultat de ta requete dans un tableau, et ensuite selon ton choix, tu le mélanges plus ou moins aléatoirement. En très simple, tu prends le premier élément du tableau et tu l'ajoutes tout a la fin, comme ca ton résultat sera toujours différent (meme si tres ressemblant) mais tu peux faires des algos un peu plus compliqués pour mélanger (faire des reverse etc.)

  3. #3
    Membre du Club Avatar de bodysplash007
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 154
    Points : 58
    Points
    58
    Par défaut
    En fait je recherche juste a ce que mes enregistrement ne s'affiche pas dans les meme ordre deux fois de suite.

    par exemple

    enregistrement 1
    enregistrement 2
    enregistrement 3

    puis lors de ma recherche suivante on pourrait avoir:

    enregistrement 2
    enregistrement 3
    enregistrement 1

    Mais tou ça sans jamais afficher 2 fois le meme enregistrement

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Pour MySQL :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ... ORDER BY RAND();

  5. #5
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Citation Envoyé par julp
    Pour MySQL :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ... ORDER BY RAND();
    Je dirai que ca, ca va juste choisir sur quelle colonne trier, donc s'il a 100 colonnes ca peut valoir le coup mais avec 3 colonnes et 10 000 résultats ca ne lui fera pas beaucoup de différences.

    Ton affichage doit être distinct quand on fait plusieurs fois la recherche de suite? ou sur plusieurs jours?
    Parce que dans le premier cas, le fait de récupérer tout dans un tableau, et de lafficher dans le désordre c'est assez facile. Tu mémorises a quel "mélange" tu étais la fois précédente et tu recommences.

  6. #6
    Membre du Club Avatar de bodysplash007
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 154
    Points : 58
    Points
    58
    Par défaut
    EN fait chaque fois que je clique sur mon bouton rechercher je dois avoir un affichage different.

    En fait j'ai penser a un truc mais j'aimerai votre avis

    je compte recuperer les ids des annonces et en faire un vecteur, ensuite creer un deuxieme vecteur avec le meme nombres de champ et ou il y aurait que des 0.

    une fois ça je compte le nombre de ligne recuperées.

    Bon je genere un nombe avec le rand entre 0 et le nombre de ligne de la requete

    ensuite je teste si dans le tab2 (la ou les champs sont a 0) à l'indice généré par rand, le contenu est égal à 0.

    Si oui je l'affiche via son ID qui est dans le tab1 au meme indice puis dans le tab2 je met 1 et ensuite je regenere un nombre

    Si non je regenere un nouveau nombre


    Je continue ça tant que tout les champs de mon tab2 ne soit pas égale a 1.
    Et a ce moment la tout les champs de m'arequete seront afficher dans un ordre different chaque fois.

    Mon procédé n'est que théorique j'y bosse dessu mais penser vous que c'est un bon ou dois je plutot essayer autre chose???

  7. #7
    Membre du Club Avatar de bodysplash007
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 154
    Points : 58
    Points
    58
    Par défaut
    En fait lors de mon affichage, j'aafiche les enregistrement 5 par 5 et lorsque je clique sur suivant avec un rand() il me reaffiche de temps en temps un enregistrement se trouvant à la page anterieure

  8. #8
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Je ne comprends plus bien ce qui te pose probleme du coup? Et ensuite, a quoi ca va servir (si je peux me permettre de demander )

  9. #9
    Membre du Club Avatar de bodysplash007
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 154
    Points : 58
    Points
    58
    Par défaut
    ben a afficher les champs de manière aleatoire

  10. #10
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Citation Envoyé par bodysplash007
    En fait lors de mon affichage, j'aafiche les enregistrement 5 par 5 et lorsque je clique sur suivant avec un rand() il me reaffiche de temps en temps un enregistrement se trouvant à la page anterieure
    C'est donc cette partie que je n'ai pas compris. Quand tu fais "suivant" ca t'affiche la suite des résultats? Ca doit remélanger? tu aurais du code par hasard?

  11. #11
    Membre du Club Avatar de bodysplash007
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 154
    Points : 58
    Points
    58
    Par défaut
    En fait le code n'est pas de moi et cette partie la n'est pas très claire. Mon predecesseur n'a pas mis de commentaire. En fait je fais une requete pour aller chercher les client et je les affiche 5 par 5. bon je les affichais par ordre décroissant en fonction de leur date de connexion. En gros quand je clique sur suivant il va afficher les 5 suivants. Bon mon truc maintenant c'est de pouvoir les afficher de manière aléatoire mais toujours 5 par 5.

    Bon pour ce qui est de ma solution, elle est bien belle en theorie mais en pratique ça ne marche pas a foire deja lors de la première boucle, celle qui rempli le tab1.

    Quelqu'un a t'il une autre idée pour tester???

    Merci

  12. #12
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Et est ce qu'on peut voir ton morceau de code qui implémente l'idée que t'as exposé tout a l'heure? Parce qu'elle me semblait correcte, de dire "je choisis une annonce au hasard, et je me souviens que je l'ai faite" puis je recommence a en choisir une autre etc.

    Un petit probleme est que quand t'auras affiché "quasiment" toutes les annonces ca va devenir difficile de tomber "aléatoirement" sur un des id par encore traités.

    Tu pourrais créer un tableau contenant la liste des id a afficher. Tu choisis un nombre aléatoire avec rand entre 0 et le nombre d'id-1, une fois que c'est fait, tu retires cet id du tableau (pour pas l'afficher de nouveau), tu as donc un id de moins et tu recommences, jusqu'a ce que tu aies tout affiché?

  13. #13
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    Citation Envoyé par koopajah
    Je dirai que ca, ca va juste choisir sur quelle colonne trier, donc s'il a 100 colonnes ca peut valoir le coup mais avec 3 colonnes et 10 000 résultats ca ne lui fera pas beaucoup de différences.

    Ton affichage doit être distinct quand on fait plusieurs fois la recherche de suite? ou sur plusieurs jours?
    Parce que dans le premier cas, le fait de récupérer tout dans un tableau, et de lafficher dans le désordre c'est assez facile. Tu mémorises a quel "mélange" tu étais la fois précédente et tu recommences.
    Non,
    ORDER BY RAND() fonctionne tres bien, c'est une fonctionnalité de mysql et ca ne va pas "trier sur une colonne au hasard". Essaye avec une table ne contenant qu'une seule colonne et 10 enregistrement, tu finiras pas avoir les 10 enregistrements si tu execute assez de fois la requete.

  14. #14
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Citation Envoyé par Fladnag
    Non,
    ORDER BY RAND() fonctionne tres bien, c'est une fonctionnalité de mysql et ca ne va pas "trier sur une colonne au hasard". Essaye avec une table ne contenant qu'une seule colonne et 10 enregistrement, tu finiras pas avoir les 10 enregistrements si tu execute assez de fois la requete.
    En effet ! J'aurai du tester au lieu de juste supposer. J'aurai pensé que ca sortait aléatoirement un numéro de colonne sur laquelle appliquer la clause ORDER BY.

    Ca fait donc exactement ce que tu souhaitais bodysplash (en beaucoup plus simple). Parce que tu vas récupérer la liste de tes annonces dans un ordre aléatoire et tu vas juste avoir besoin de faire des fetch 5 par 5 pour avoir ta liste correctement construite.

    Je note ca dans un coin pour plus tard, merci pour l'astuce Fladnag

  15. #15
    Membre du Club Avatar de bodysplash007
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 154
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par koopajah
    En effet ! J'aurai du tester au lieu de juste supposer. J'aurai pensé que ca sortait aléatoirement un numéro de colonne sur laquelle appliquer la clause ORDER BY.

    Ca fait donc exactement ce que tu souhaitais bodysplash (en beaucoup plus simple). Parce que tu vas récupérer la liste de tes annonces dans un ordre aléatoire et tu vas juste avoir besoin de faire des fetch 5 par 5 pour avoir ta liste correctement construite.

    Je note ca dans un coin pour plus tard, merci pour l'astuce Fladnag

    Niet j'ai pas ce qu'il me faut avec le RAND, j'ai testé et ensuite quand je clique sur suivant il m'affiche d'autres enregistrement mais le hic c'est que quelque fois un enregistrement réapparait plusieurs fois d'une page a l'autre donc je vais m'orienter plus tot sur mon idée de tableau d'ID.

  16. #16
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Quand tu cliques sur suivant, ca fait quoi comme action? Ca refait la requete? Parce que dans ce cas c'est normal. Il faut que, quand tu cliques sur suivant, tu continues de récupérer les résultats de la requete (exécutée une seule fois à l'affichage des 5 premières annonces)

  17. #17
    Membre expérimenté

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Points : 1 565
    Points
    1 565
    Par défaut
    si tu veux avoir les memes résultats en executant plusieurs fois la requete, je suis moins sur, mais tu peux tester en passant un parametre a RAND :
    "...ORDER BY RAND(".$param.")"

    $param devra etre identique d'une page sur l'autre, donc une sorte de "session" (l'ID de session est tres bien, ou une autre variable stockée en session). Cela devrait permettre de générer les memes nombres aléatoires, et donc le meme ordre au fil des pages.

    A utiliser avec un LIMIT X,Y pour la pagination ;o)

  18. #18
    Membre du Club Avatar de bodysplash007
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 154
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par Fladnag
    si tu veux avoir les memes résultats en executant plusieurs fois la requete, je suis moins sur, mais tu peux tester en passant un parametre a RAND :
    "...ORDER BY RAND(".$param.")"

    $param devra etre identique d'une page sur l'autre, donc une sorte de "session" (l'ID de session est tres bien, ou une autre variable stockée en session). Cela devrait permettre de générer les memes nombres aléatoires, et donc le meme ordre au fil des pages.

    A utiliser avec un LIMIT X,Y pour la pagination ;o)
    Je comprend pas bien ce que je dois mettre comme paramètre dans la focntion RAND saurait tu détaillé un peu?

  19. #19
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    Ton rand() peut, si tu veux, prendre un paramètre (une graine) qui va te permettre de retrouver exactement le meme résultat si tu exécutes deux fois de suite la requete avec la meme graine (le meme paramètre).

    Donc ce que tu fais c'est ca en gros:

    1/ tu tires un nombre aléatoire
    2/ tu exécutes ta requete en lui passant le nombre en parametre de ton rand et en limitant le nombre de résultat a 5:
    SELECT * FROM matable ORDER BY Rand(magraine)
    LIMIT 0,5

    3/ quand tu cliques sur suivant, tu exécutes la meme requete (donc avec la graine identique) mais tu changes les bornes du LIMIT :
    LIMIT 6,5

    etc.

  20. #20
    Membre du Club Avatar de bodysplash007
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    154
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 154
    Points : 58
    Points
    58
    Par défaut
    ah ok merci c'est plus clair.

    Pour le nombre aléatoire, j'ai essayé d'en générer un, mais chaque fois que je clique sur suivant il mre regénère un nouveau nom, normal vu que je refais de nouveau la requete. comment faire pourqu'il me genere un nombre aléatoire que lorsque la requete est finie. Si je regenere une variable aleatoire pour ma graine lorsuqe que je post seulment ma rechercher ça devrait aller non???
    je veux dire que lorsque je clique sur rechercher et non sur suivant

Discussions similaires

  1. [MySQL] Pagination requète aléatoire
    Par tom.dev dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 28/11/2013, 15h17
  2. Requête aléatoire et pagination
    Par Nowwis dans le forum Langage
    Réponses: 4
    Dernier message: 11/08/2011, 19h09
  3. [MySQL] Affichage requête imbriquée
    Par sql dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 07/04/2006, 21h48
  4. affichage requête sql sous phppgadmin
    Par kerzut dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 25/02/2005, 12h39
  5. Réponses: 15
    Dernier message: 20/07/2004, 09h22

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