JeuWeb - Crée ton jeu par navigateur
[SQL] Récupérer un champ aléatoire - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : [SQL] Récupérer un champ aléatoire (/showthread.php?tid=3408)

Pages : 1 2 3


[SQL] Récupérer un champ aléatoire - Faelnor - 09-12-2008

Bonjour,

Je m'explique, en fait je cherche à créer une table avec le nom de toutes les villes, j'aimerais qu'à l'inscription il y ai une requête faîte à la base de données qui prendrait une des villes au hasard mais je ne vois pas du tout comment le faire.

Merci d'avance.


RE: recuperer un Champ de base de donnees au hasard - Seren - 09-12-2008

Tu peux regarder la discussion en bas de cette page qui parle de "Random".

http://dev.mysql.com/doc/refman/5.0/en/select.html

C'est des solutions 100% MySQL.

Alternativement, tu peux générer un id alétaoirement avec une fonction php :

http://de3.php.net/manual/fr/function.mt-rand.php

Et le chercher dans la table.

(Attention il faut probablement générer un nombre aléatoire entre 1, et ton nombre maximum de ville.)


RE: recuperer un Champ de base de donnees au hasard - Sephi-Chan - 09-12-2008

Bonjour,

Voilà une requête qui devrait te convenir :
Code :
SELECT * FROM villes ORDER BY RAND() LIMIT 1


Sephi-Chan


RE: recuperer un Champ de base de donnees au hasard - Faelnor - 10-12-2008

finallement j'ai fait sa , sa a l'air de marcher


Code PHP :
<?php 
$reponseville
= mysql_query("SELECT COUNT(ville_id) AS id FROM villes ORDER BY id")or die("Erreur SQL : $query<br/>".mysql_error()) ;//nombre total de villes dans la table id
$nbvilles= mysql_fetch_array($reponseville);
$random= rand(1,$nbville['id']);
$repville= mysql_query("SELECT name_ville FROM villes where ville_id = $random");
$villes= mysql_fetch_array($repville);
$ville= $villes['name_ville'];

mais je sais pas si question optimisation c'est bon.


RE: recuperer un Champ de base de donnees au hasard - Karedas - 10-12-2008

(10-12-2008, 10:11 AM)diablo846 a écrit : finallement j'ai fait sa , sa a l'air de marcher
mais je sais pas si question optimisation c'est bon.

La solution proposée par Sephi-Chan est de loin bien meilleure. Tu n'as qu'une commande sql à lancer et tu ne fais pas travailler php hors de la lecture du recordset.

En prime si tu as une bonne classe mysql, le tout tient en 1 ligne:
Code PHP :
<?php 
$vile
= $maClasseMysql->sqlunique("select name_ville from villes order by rand() limit 1";



RE: recuperer un Champ de base de donnees au hasard - Seren - 10-12-2008

D'après la discussion sur le premier lien que j'ai filé, il semblerait que le ORDER BY RAND() peut être coûteux si on a une grosse table. Si il n'y a qu'une dizaine, voir une centaine de ville c'est sûrement la meilleur solution.


RE: recuperer un Champ de base de donnees au hasard - Karedas - 10-12-2008

(10-12-2008, 11:28 AM)Seren a écrit : D'après la discussion sur le premier lien que j'ai filé, il semblerait que le ORDER BY RAND() peut être coûteux si on a une grosse table. Si il n'y a qu'une dizaine, voir une centaine de ville c'est sûrement la meilleur solution.

En effet je viens de faire le test sur une table de 25 millions d'enregistrements totalisant 2.1Gb => 178 secondes pour avoir une réponse.
Su 2.5 millions totalisant 184Mb => j'ai un résultat en 7 secondes.
Sur 300000 totalisant 90Mb => 600ms

Effectivement même sur une petite table de 300000 lignes c'est franchement nul. A réserver donc à des infos en faible nombre.


RE: recuperer un Champ de base de donnees au hasard - Seren - 10-12-2008

Merci d'avoir testé et de nous avoir donné le résultat. Smile


RE: recuperer un Champ de base de donnees au hasard - Sephi-Chan - 10-12-2008

Oui j'ai eu l'occasion de faire quelques tests avec cette fonction (pour mieux me rendre compte de ce qu'on lui reprochait).

Toutefois, il faut mettre ça en relation avec le nombre d'appel à cette requête et la taille de la table :
  • D'après le contexte qui nous est donné, il y a plusieurs personnages pour une ville, donc la table ville contiendra assez peu d'enregistrement.
  • De plus, cette requête n'est appelée qu'à l'inscription, on peut donc se permettre d'utiliser une requête un peu gourmande pour conserver un code clair.
  • Enfin, le script PHP proposé peut poser problème si les identifiants de villes ne se suivent pas. C'est donc plutôt lourd.

Voilà pourquoi je maintiens que — dans ce cas — la requête que je propose est meilleure. Smile


Sephi-Chan


RE: recuperer un Champ de base de donnees au hasard - phenix - 10-12-2008

Si l'ORDER BY rand() est plus lent sur un grosse table, il reste quand même plus rapide que le système avec PHP...

De plus, je doute que tu arrives à 300000 villes :hahahaha: