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 :

Plusieurs résultats aléatoires uniques en même temps? [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Novembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement de composants
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 34
    Points : 40
    Points
    40
    Par défaut Plusieurs résultats aléatoires uniques en même temps?
    Bonjour,

    je cherche à optimiser une procédure de sélection de N résultats aléatoires dans une table. Le but est d'obtenir N mots pour un nuage de mots intitulé "Mots et expressions au hasard" dans cet exemple : http://www.aquaportail.com/definitio...urs-d-eau.html

    La table contient plus de 8000 mots (et fera 15 ou 20.000 enregistrements à terme) et je cherche à en extraire N mots d'une façon totalement aléatoire.

    Actuellement, c'est une boucle qui fait N SELECT... et N vaut 12 (depuis peu, c'était à 15 il y a encore 10 jours!). Souhaitant optimiser cette partie, j'ai trouvé quelques informations sur RAND et il serait envisageable d'obtenir mes N mots en faisant quelque chose du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT id, mot FROM ... ORDER BY RAND() LIMIT 12" (ou N).
    Mais les quelques lectures s'accordent toutes sur une conclusion : ORDER BY RAND est une requête lente... Remplacer une boucle rapide par une requête lente, je ne suis pas certain d'y gagner.

    Quelle serait la solution idéale dans mon cas? Je précise qu'il y a un index sur "id" mais pas sur "mot" (d'ailleurs, je me demande si ce ne serait pas intéressant d'en créer un sur ce champ constamment utilisé???).
    Merci d'éviter le poisson rouge dans une boule, ces poissons peuvent grandir jusque 25 cm!

  2. #2
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    à ta place je tirerai les id au hasard dans php et je les sortirai de la base avec une requete en WHERE id IN ("id","id","id")

    ça marche bien si tu n'as pas de trous. Si tu as peu de trous (10%) je ferai la même chose avec 11%+1 id en plus et je ne garde que les id que X premiers éléments.
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Novembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement de composants
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 34
    Points : 40
    Points
    40
    Par défaut
    Merci pour cette proposition. Il n'y a effectivement presque pas de trous : l'autoincrément est à 8277 et il y a 8261 mots = 16 trous, que je peux facilement combler manuellement directement dans la table.

    Merci, je vais essayer cela, et si une autre idée vient, j'essayerais de voir laquelle est la plus satisfaisante.
    Merci d'éviter le poisson rouge dans une boule, ces poissons peuvent grandir jusque 25 cm!

  4. #4
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    ne comble pas les trous,

    demande 40 mots en SQL pour en retenir 20 en php. comme ça tu te fais pas *** avec les troux: ils reviendront. Je sais c'est pas déterministe.

    Sinon tu en tire 20, si tu en obtient moins tu retire 20 et apres tu choisis les mots.

    ceci dit, je pense que dans ta version 2 tu devrais proproser des mots "interessants" plutot que des mots "aléatoires".
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Novembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement de composants
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 34
    Points : 40
    Points
    40
    Par défaut
    Merci encore une fois. Mais vu le faible pourcentage de trous, ce n'est pas un drame s'il manque un mot : ponctuellement, il y aurait N-1 mots aléatoires affichés.

    ps: ça restera aléatoire, c'est un choix par expérience sachant que les co-occurences sont déjà largement implantées dans les définitions elles-mêmes.
    Merci d'éviter le poisson rouge dans une boule, ces poissons peuvent grandir jusque 25 cm!

  6. #6
    Membre du Club
    Homme Profil pro
    Ingénieur développement de composants
    Inscrit en
    Novembre 2007
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Ingénieur développement de composants
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2007
    Messages : 34
    Points : 40
    Points
    40
    Par défaut
    Voilà, j'ai fait la modificiation et ça fonctionne.

    1 seule requête au lieu de 12, c'est bizance.
    Merci d'éviter le poisson rouge dans une boule, ces poissons peuvent grandir jusque 25 cm!

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/10/2009, 17h22
  2. Utiliser plusieurs fois ma classe en même temps
    Par Princeless74 dans le forum C++
    Réponses: 6
    Dernier message: 05/01/2008, 21h54
  3. Réponses: 4
    Dernier message: 06/11/2007, 14h36
  4. Intercepter plusieurs touches du clavier en même temps
    Par fabseven dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 13/03/2007, 18h20
  5. Tester l'état de plusieurs touches du clavier en même temps
    Par wikers dans le forum Composants VCL
    Réponses: 7
    Dernier message: 11/11/2004, 09h13

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