OVH Community, votre nouvel espace communautaire.

SQL - Selection aléatoire?


Nuranto
11/11/2006, 10h30
En effet c'est pas mal!

Je vais peut etre changer vers cette option... Mais stockage en BDD, et changement d'ordre journalier, ca peut etre pas mal!

Merci bcp! ^^

D.Thorn
10/11/2006, 22h48
Hmmm plutôt que de sortir tous tes résultats d'un coup, pourquoi ne pas utiliser en effet les sessions et stocker à l'avance uniquement les ids désordonnées des produits à afficher par page (en utilisant ensuite une requête MySQL par page) ?

1ère étape : on initialise:
-> select distinct mon_id from ma_table order by rand() (+ LIMIT nombre total de résultats aléatoires pour toutes tes pages).
tu récupères le résultat,

2ème étape : que tu stockes dans tableau de chaines qu'on colle en session
Genre :

$all_results_array = array();
// on peut ptet faire un gros implode sur $result ? hmmm
// ou un fetch_assoc, bref, on récupère tout
while($record = mysql_fetch_array($result)) {
$all_results_array[]= $record['mon_id'];
}
// on peut libérer le résultat mysql si ca nous chante

// methode bourrine-mais-qui-marche
$split_results_array = array();
for ($i = 0; $i < $nb_pages_max; $i++) {
$curr_page_ids = '';
$start = $i * $results_per_page;
$end = ($i +1) * $results_per_page;
for ($j = $start; $j < $end; $j++) {
$curr_pages_id = $all_results_array[$j] . ',' ;
}
if (strlen($curr_page_ids) > 0) {
$curr_page_ids = substr($curr_page_ids, -1);
}
$split_results_array[$i] = $curr_page_ids;
}
=> $split_results_array en session.

3ème étape :
Par page, tu fais ta requête sur les "mon_id" stockées dans chaque "chaine de page".
$current_page_ids = $_SESSION['my_split_results_array'][$curr_page];
=> "select ... from ma_table where mon_id IN (".$current_page_ids.")";

Et tu peux même rajouter à nouveau du RAND() si ca te change sur ces sous-résultats.

Aprés à toi de voir si tu veux vraiment avoir des pages qui bougent en fonction de chaque utilisateur ...
=> Le tableau précalculé peut tout à fait se mettre dans une table de la BDD prévue à cette fin ...

Code fourni sans garantie d'absence totale d'erreurs de syntaxe, de prog, etc... vu l'heure ...

Nuranto
11/10/2006, 17h12
(merci ^^)
Oép j'ai pensé au random en php sur chaque pages, mais ca ne me suffit pas.

Pour le 2eme point, j'ai pas compris ? Ce serait tout sortir en aleatoire et de stocker en variable de session? Si c'est ca bcp trop lourd (la page en elle meme est deja bien lourde)


La je suis parti sur une nouvelle idée:
Je sors un nombre aleatoire entre 0 et x (ou x est la taille de ma table -1) et je commence ma premiere page par ce x, la 2e par x+10 etc...
Mais ca pose pas mal de soucis (y'a une page ou faut concatener les derniers resultats de la tables avec les premier, et pas facile pour connaitre la page courante...)

Pour l'instant je continue la dessus, mais si vous avez de meilleurs idée, je suis preneur!

Gagar
10/10/2006, 21h55
Tu peux peut-être partager le boulot entre MySQL et php:
1. MySQL sort les résultats par page et php fait le rand dans cette page
(inconvénient: aléatoire seulement à l'intérieur de la page)
ou
2. l'inverse. Mieux, mais à voir pour les ressources sous PHP si tu as vraiment beaucoup de résultats...

What do you guys think?

muab
10/10/2006, 16h53
tu ne peux pas faire ce que tu dis a partir du moment où tu as plusieurs pages... un truc aléatoire complet donne un résultat aléatoire complet...

Donc, soit une seule page aléatoire, soit utilisé un système de token (compteur) pour essayer de voir quelles enregistrements ont ete vus puis declenches des seuils d'affichage... Ca pourrait (peut-etre) marche.

A+

Nuranto
10/10/2006, 16h46
Bonjour!

J'ai une table avec beaucoup d'enregistrements.
Et j'ai une page ou je les affiche (en plusieurs pages).
Je voudrais que cet affichage soit aléatoire, et ca c'est très compliqué car l'affichage se fait en plusieurs page !

Pour utiliser l'aleatoire en sql j'utilise :
Code:
ORDER BY RAND()
Mais le systeme de pages ne marche plus puisque l'ordre est aléatoire sur chaque page...
Je ne sais pas si je suis clair...
Si quelqu'un a une idée...