Affichage aleatoire mais SANS doublon

Eléphant du PHP | 113 Messages

06 déc. 2006, 19:58

Bonjour,
J'utilise un affichage des mes citations au hasard
ORDER BY rand()

Mais le hasard est forcément hasardeux et certaines citations se répètent parfois sur la page suivante. Enervant quoi !

Connaissez-vous une astuce, sans trop rentrer dans une usine à gaz, pour éviter ça ?

Merci.

ViPHP
ViPHP | 1961 Messages

06 déc. 2006, 20:20

Bonjour,

Tu ajoutes la clause "DISTINCT"
SELECT DISTINCT mon_champ FROM ma_table ORDER BY RAND();
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Eléphant du PHP | 113 Messages

06 déc. 2006, 20:49

Apparemment, ça marche pas. Ca se répète encore. :?

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

06 déc. 2006, 20:59

sur la page suivante
"L'astuce" du DISTINCT ne fonctionera donc pas puisque tu refait une requete par page.

Le distinct sert dans le cas où tu as plusieurs fois la même valeur pour un champ pour n'en récupérer qu'un exemplaire.

Il te faudrais récupérer les "id" des citations déjà affichées et effectuer une requête avec NOT IN par exemple.
Supposons que tu enregistre les "id" en session" tu as donc:
// variable qui va servir pour construire une requete dynamique en fonction des id déjà affichés une fois
$query_plus = "";

// si la variable de session existe alors on construit la requete avec un implode() sur les id déja affichés.... résultat => AND id NOT IN (1,5,12) .... par exemple
if(isset($_SESSION['les_id']))
     $query_plus = " AND id NOT IN (".implode(",",$_SESSION['les_id']).")";
else 
     $_SESSION['les_id'] = array(); // sinon on initialise la variable de session à vide.

//requete dynamique avec le bout de requete à ajouter le cas échéant
$query = "SELECT DISTINCT mon_champ FROM ma_table ".$query_plus." ORDER BY RAND()";
$tab_id = array();
//exécution requete et boucle
{     
     $tab_id[] = $id; //id de la requete, citation affichée
}
// récupération des id en sesion en "concaténant" les tableaux de session et des "id" actuellement affichés pour les exclure de la requete suivante
$_SESSION['les_id']=array_merge($_SESSION['les_id'],$tab_id);
Modifié en dernier par Truc le 06 déc. 2006, 21:30, modifié 1 fois.

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

ViPHP
ViPHP | 1961 Messages

06 déc. 2006, 20:59

Re,

Montre ta requête, que l'on puisse voir plus clair.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

ViPHP
ViPHP | 1961 Messages

06 déc. 2006, 21:06

sur la page suivante
"L'astuce" du DISTINCT ne fonctionera donc pas puisque tu refait une requete par page.

Le distinct sert dans le cas où tu as plusieurs fois la même valeur pour un champ pour n'en récupérer qu'un exemplaire.

Il te faudrais récupérer les "id" des citations déjà affichées et effectuer une requête avec NOT IN par exemple.
Supposons que tu enregistre les "id" en session" tu as donc:
$query_plus = "";
if(isset($_SESSION['les_id']))
     $query_plus = " AND id NOT IN (".implode(",",$_SESSION['les_id']).")";
else 
     $_SESSION['les_id'] = array();

$query = "SELECT DISTINCT mon_champ FROM ma_table ".$query_plus." ORDER BY RAND()";
$tab_id = array();
//exécution requete et boucle
{     
     $tab_id[] = $id; //id de la requete, citation affichée
}
// récupération des id en sesion en "concaténant" les tableaux de session et des "id" actuellement affichés pour les exclure de la requete suivante
$_SESSION['les_id']=array_merge($_SESSION['les_id'],$tab_id);
Ceci est valable si la version de MySQL est => 4.1
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Eléphant du PHP | 113 Messages

06 déc. 2006, 21:12

La voici:
$result = mysql_query("
                      SELECT DISTINCT citateurs_perso.nom, citateurs_perso.prenom, citations_perso.id, citations_perso.citation
                      FROM citateurs_perso LEFT JOIN citations_perso ON citateurs_perso.id = citations_perso.numcitateur 
                      WHERE score < 45 ORDER BY rand()
                      ASC $limit_str");

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

06 déc. 2006, 21:17

Ceci est valable si la version de MySQL est => 4.1
Toutàfé :)

J'ai quand même 8 chances sur 10 qu'il se trouve dans ce cas 8-|

De quelle version disposes tu ?

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

ViPHP
ViPHP | 1961 Messages

06 déc. 2006, 21:20

Ceci est valable si la version de MySQL est => 4.1
Toutàfé :)

J'ai quand même 8 chances sur 10 qu'il se trouve dans ce cas 8-|

De quelle version disposes tu ?
C'est la St Nicolas et comme tu as été gentil il va te faire un cadeau !
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Eléphant du PHP | 113 Messages

06 déc. 2006, 21:20

4.8

ViPHP
ViPHP | 1961 Messages

06 déc. 2006, 21:21

Re,

Cette requête, tu la fait plusieurs fois comme le dit Truc?

Si c'est le cas tu devras utiliser la méthode qu'il t'a donné ou bien
l'executer une fois et conserver les résultats dans une variable (tableau) session et supprimer à chaque fois le poste utilisé.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Eléphant du PHP | 113 Messages

06 déc. 2006, 21:26

je l'savais que ça allait se compliquer :wink:

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

06 déc. 2006, 21:27

C'est la St Nicolas et comme tu as été gentil il va te faire un cadeau !
4.8
Merci, merci :fete:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Modérateur PHPfrance
Modérateur PHPfrance | 7636 Messages

06 déc. 2006, 21:31

je l'savais que ça allait se compliquer :wink:
j'ai éditer mon 1er message pour y ajouter plus de commentaires :wink:

/!\ Avant de poster se documenter et rechercher.
Qui ne sait pas rendre un service n'a pas le droit d'en demander.
MaBrute

Eléphant du PHP | 113 Messages

06 déc. 2006, 21:33

Merci, j'm'y colle.