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.
Bonjour,
Voilà une requête qui devrait te convenir :
Code :
SELECT * FROM villes ORDER BY RAND() LIMIT 1
Sephi-Chan
finallement j'ai fait sa , sa a l'air de marcher
Code 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.
(12-10-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 :
$vile = $maClasseMysql->sqlunique("select name_ville from villes order by rand() limit 1";
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.
(12-10-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.
Merci d'avoir testé et de nous avoir donné le résultat.

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.
Sephi-Chan
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
