Bonjour,
j'utilise un script pour extraire des données de manière aléatoire et en plus sans doublons. Tant que je fais mon test sur un champ (nom_img) tout fonctionne, je récupère la liste des noms des images sans doublons. Par contre j'aurais à ce moment là besoins de récupéper un autre champ (chemin_image)en rapport avec la liste. Mais quand j'essaye, mon tirage aléatoire me donne parfois 2 noms identiques (se reportant à deux images différentes).
voici mon script:
j'ouvre la base...puis
$a = 10; //variable limiter le nombre de sorties d'enregistrement
$requete = mysql_query("SELECT distinct nom_img , chemin_imgage FROM table_images ORDER BY rand() LIMIT $a");
//je rempli un tableau
while ($row = mysql_fetch_array($requete))
{
$tableau_img[] = $row[0];
$tableau[] = $row[1];
}
si par contre je ne mets que : SELECT distinct nom_img FROM...
ça me donne bien des noms sans doublons. Mais là, j'ai plus le chemin ds images correspondantes...
comment faire ?
merci
Salut,

Essai avec Select distinct(nom_img), chemin_image From table_image...

Je sais que sur MS SQL ça fonctionne pas, mais sur MySQL ça devrait faire le distinct que sur le nom_img.

A+
Salut gaeil,

bon, moi pour ces choses là, je ne sais pas t'aider, mais ce que je peux faire, c'est te conseiller pour faire en sorte que tu puisses obtenir une meilleure lisibilité quand tu mets du code dans un message.

en fait, avant d'insérer le code, tu peux cliquer sur le bouton "code" en dessous de la fenêtre de saisie du texte, puis, tu insère le code en question et après, tu reclique sur le bouton "code".

De cette manière, tu obtiens ce résultat :
$a = 10; //variable limiter le nombre de sorties d'enregistrement
$requete = mysql_query("SELECT distinct nom_img , chemin_imgage FROM table_images ORDER BY rand() LIMIT $a");
//je rempli un tableau
while ($row = mysql_fetch_array($requete))
{
$tableau_img[] = $row[0];
$tableau[] = $row[1];
} 


voilà à+ Smiley cligne
Touvert
Salut
Si tu tiens à pouvoir spécifier plusieurs chemins pour un même nom d'image, il faudrait créer une table supplémentaire et utiliser les jointures pour sélectionner uniquement le premier chemin trouvé correspondant au nom de l'image.

Table_principale : ne contient pas les chemins
id, nom_image,tes autres colonnes,tes autres colonnes,etc ...

Table_secondaire : contenant les chemins uniquement
id,chemin_d_acces1,chemin_d_acces2,chemin_d_acces3,etc..


Pour récupérer les valeurs :

SELECT nom_image,chemin_d_acces1
FROM Table_principale t1,Table_secondaire t2
WHERE t1.id=t2.id

Modifié par Ralfman68 (30 Nov 2006 - 04:28)
Hacken a écrit :
Salut,

Essai avec Select distinct(nom_img), chemin_image From table_image...

Je sais que sur MS SQL ça fonctionne pas, mais sur MySQL ça devrait faire le distinct que sur le nom_img.

A+

ça à l'air pas mal..
j'ai rajouté ça pour afficher

 $result = mysql_query("Select distinct(nom_img), ch_img table_images ORDER BY rand() LIMIT $a");

if (!$result) {
    echo 'Impossible d\'exécuter la requête : ' . mysql_error();
    exit;
}
$row = mysql_fetch_row($result);

echo $row[0]; 
echo $row[1]; 

mais là j'ai un message d'erreur


Impossible d'exécuter la requête : 
Unknown column 'nom_img' in 'field list'

ma table contient les champs :
id INT(11) (auto increment)
ch_img varchar(200)
nom_img varchar(22)

Smiley decu
Modifié par gaeil (30 Nov 2006 - 19:57)
effectivemment, avec FROM c'est mieux ! Smiley ravi
mais bon, j'en suis au même point. la requête (qui m'affiche 5 images parmis celles du tableau) sort de temps à autre deux fois la même image, c'est à dire, quelque chose comme :

tulipe
rose
camélia
rose
marguerite




comme si le tri sur distinct(nom_img), ne fonctionnait pas... Smiley decu
Modifié par gaeil (01 Dec 2006 - 19:01)
bonjour,

- quelle est la strucutre de ta base (comme conséillé par ralfman, l'utilisation d'une table intermediaire est plus souple et plus performante)

- quelle est ta requete exacte ?

avec ces infos la on peut peut etre faire qqch...
kemar a écrit :
bonjour,

- quelle est la strucutre de ta base (comme conséillé par ralfman, l'utilisation d'une table intermediaire est plus souple et plus performante)

- quelle est ta requete exacte ?

avec ces infos la on peut peut etre faire qqch...

bon on va donc tout reprendre à zéro. Smiley confus
La structure de la table est très simple :
ma table contient les champs :
id INT(11) (auto increment)
ch_img varchar(200) - elle contient le chemin vers les images
nom_img varchar(22) - elle contient le nom des images (et il peut y avoir plusieur fois le même nom pour le champ nom_img, mais il renvoi vers une image différente (le chemin est différent, le champ ch_img ne contient pas la même valeur).
exemple : nom_img = rose (il y a dans le champ correspondant ch_img du même enregistrement, le chemin vers une image de rose rouge) , puis un autre champ avec nom_img )= rose (aussi..) , mais là, il y a dans le champ ch_im , correspondant à ce deuxième enregistrement, le chemin vers l'image d'une rose jaune...
mon code :

classique ouverture de la base puis,
$a = 10; 
$result = mysql_query("SELECT DISTINCT (nom_img), ch_img FROM table_images ORDER BY rand() LIMIT $a");

if (!$result) {
    echo 'Impossible d\'exécuter la requête : ' . mysql_error();
    exit;
}
while ($row = mysql_fetch_array($result))
  {
      $tableau[] = $row[0];
	  $tableau_img[] = $row[1];
  }
// ensuite j'affiche le résultat des variables du tableau.
$f = 1;
$g = 2;
$h = 3;
$j = 4;
$k = 5;
echo $tableau_img[$f];
echo '<br>';echo $tableau[$f];
etc...

voilà. Donc le problème, c'est que je fais un tirage aléatoire du nombre d'images (ici 10 défini par $a). mais le problème c'est que je ne veux pas qu'il me sorte par exemple deux photos de roses. Il faut donc éviter les doublons sur ce nom de champ (nom_img).
ça fonctionne très bien tan que je n'indique que ce champ dans ma requête.



$result = mysql_query("SELECT DISTINCT nom_img FROM table_images ORDER BY rand() LIMIT $a")



le problème, c'est que là, avec cette requête, je n'ai que le nom des images (sans doublon) dans la variable $result, mais je n'ai pas accès au champ correspondant (ch_img) de chaque enregistrement, qui contient lui le chemin vers chacune de ces images.
voilà), j'espère que mes explications sont plus claires et qu'elles vous permettront de résoudre l'énigme ! Smiley biggol
Mais effectivemment, peut-être que la seule solution est de créer 2 tables...je veux pas entrer dans les détails, mais ça me compliquerait la tâche...mais bon, s'il n'y a pas d'autres solution, il faudra bien faire avec !
merci !
Modifié par gaeil (02 Dec 2006 - 16:27)
Une autre solution pour faire sans deuxième table se trouve du coté des contraintes ou des triggers qui permettent de forcer l'unicité d'un champ.
Modifié par Ralfman68 (03 Dec 2006 - 06:38)
Bonjour,

Pourquoi ne pas faire 2 requêtes ?
Une première qui tire alléatoirement les noms de fleurs sans doublon. Puis une seconde qui tire alléatoirement un chemin pour chacune des fleurs ?
codascii a écrit :
Bonjour,

Pourquoi ne pas faire 2 requêtes ?
Une première qui tire alléatoirement les noms de fleurs sans doublon. Puis une seconde qui tire alléatoirement un chemin pour chacune des fleurs ?

parceque si je tire le nom fleur rose
après quand je fais le deuxième tirage il faut que je tombe sur la photo de la fleur rose numéro 1 par exemple, et pas n'importe quelle fleur.

nom_img                               ch-img
[b]fleur rose rose                    [/b]http://monrep/chemin1 [b](image 1)[/b]
fleur rose jaune                    http://monrep/chemin2  (image 2)
fleur rose rouge                    http://monrep/chemin3  (image 3)
[b]fleur rose rose                      [/b]http://monrep/chemin4 [b](image 4)[/b]


et je ne peux pas éviter que le nom fleur rose rose apparaisse deux fois dans le champ nom_img pour désigner en fait chacun une photo différente. C'est pour cela qu'une fois que j'ai fait le tirage aléatoire de 5 photos sur le nom de la photo (c'est une contrainte obligatoire), il faudrait que je puisse au moins récupérer l'ID de chacun des 5 enregistrements qui viennent de sortir pour après aller chercher le champ correspondant au chemin de photo la bonne fleur.
haaaarrr! c'est compliqué Smiley biggol
Salut,

j'ai bien compris que tu ne voulais pas 2 fois le même nom mais je reste sur mon idée.
Si tu as tiré les noms en premier, tu tires ensuite alléatoirement le chemin en fonction de l'id des noms que tu as tirés !
codascii a écrit :
Salut,

j'ai bien compris que tu ne voulais pas 2 fois le même nom mais je reste sur mon idée.
Si tu as tiré les noms en premier, tu tires ensuite alléatoirement le chemin en fonction de l'id des noms que tu as tirés !

ben oui. tu as raison, c'est bien mon intention.
mais avec cette requête


$result = mysql_query("SELECT DISTINCT nom_img FROM table_images ORDER BY rand() LIMIT $a")



je ne récupère que le contenu champ nom_img (les 5 puisque j'en ai demandé 5). mais en aucun cas je n'ai accès à leur ID.
Mais je ne sais pas comment faire pour récupérer l'ID des champs pour après faire ce que tu dis, c'est à dire récupérer le champ ch_mg en fonction de l'ID
Ralfman68 a écrit :
Salut.
Il FAUT utiliser deux tables.


C'est ce que je pense aussi, ce qui éviterait aussi d'avoir plein de données en plusieurs exemplaires dans la base...

Sinon, après avoir fait le premier tirage alléatoire, je pense que quelque chose comme :
while ($i<=$a)
	{
	se connecter à la base
	$result_chemins_pour_une_fleur=mysql("select `chemin_imgage` from `table_images` where 1 and `nom_img` = $row[$i] ");
	tirer au sort un des chemins
	$i++;
	}

devrait fonctionner...