Page 1 sur 1
Affichage aleatoire mais SANS doublon
Posté : 06 déc. 2006, 19:58
par Stegue
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.
Posté : 06 déc. 2006, 20:20
par Ajoloca
Bonjour,
Tu ajoutes la clause "DISTINCT"
SELECT DISTINCT mon_champ FROM ma_table ORDER BY RAND();
Posté : 06 déc. 2006, 20:49
par Stegue
Apparemment, ça marche pas. Ca se répète encore.

Re: Affichage aleatoire mais SANS doublon
Posté : 06 déc. 2006, 20:59
par Truc
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);
Posté : 06 déc. 2006, 20:59
par Ajoloca
Re,
Montre ta requête, que l'on puisse voir plus clair.
Re: Affichage aleatoire mais SANS doublon
Posté : 06 déc. 2006, 21:06
par Ajoloca
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
Posté : 06 déc. 2006, 21:12
par Stegue
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");
Re: Affichage aleatoire mais SANS doublon
Posté : 06 déc. 2006, 21:17
par Truc
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
De quelle version disposes tu ?
Re: Affichage aleatoire mais SANS doublon
Posté : 06 déc. 2006, 21:20
par Ajoloca
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
De quelle version disposes tu ?
C'est la St Nicolas et comme tu as été gentil il va te faire un cadeau !
Posté : 06 déc. 2006, 21:20
par Stegue
4.8
Posté : 06 déc. 2006, 21:21
par Ajoloca
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é.
Posté : 06 déc. 2006, 21:26
par Stegue
je l'savais que ça allait se compliquer

Re: Affichage aleatoire mais SANS doublon
Posté : 06 déc. 2006, 21:27
par Truc
C'est la St Nicolas et comme tu as été gentil il va te faire un cadeau !
4.8
Merci, merci

Posté : 06 déc. 2006, 21:31
par Truc
je l'savais que ça allait se compliquer

j'ai éditer mon 1er message pour y ajouter plus de commentaires

Posté : 06 déc. 2006, 21:33
par Stegue
Merci, j'm'y colle.