[MySQL] sélection aléatoire d'enregistrement en fonction de ....

sélection aléatoire d'enregistrement en fonction de .... [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 26-06-2005 à 20:19:08    

Salut all,
 
Avant toute chose, je connais déjà : ORDER BY RAND() LIMIT 1.
 
J'ai un petit problème pour sélectionner aléatoirement un enregistrement :  
 
J'aimerais récupérer une image aléatoire d'une oeuvre appartenant à une collection.
Pour être plus clair, je veux afficher une liste de collection avec une image aléatoire appartenant à la collection en question.
 
-> collection 1 : image143
-> collection 2 : image432
-> etc...
 
ma requete actuelle :

Code :
  1. select distinct collection.*, images.nom
  2. from collection inner join oeuvres on collection.id_collection = oeuvres.id_collection
  3. inner join images on oeuvres.id_oeuvre = images.id_oeuvre
  4. group by collection.id_collection


 
Cette requete m'affiche bien toutes les collections mais m'affiche la première image trouvée en rapport avec la collection.
si je rajouter 'order by rand() limit 1', ben...j'ai plus qu'une collection.
si j'enleve le 'group by' pour le remplacer par 'order by rand()' - sans limit - j'ai toutes les images de la collection.
 
Savez vous comment je pourrais :
- avoir toute la liste des collection
- selectionner une oeuvre de la collection au hasard
- selectionner une image de cette oeuvre au hasard
 
en gros, la même chose que ma requête sauf que l'image serait aléatoire...
 
si ca peut aider :
collection(1,N) - (1,1)oeuvres(1,N) - (1,1)images
 
merci

Reply

Marsh Posté le 26-06-2005 à 20:19:08   

Reply

Marsh Posté le 26-06-2005 à 23:09:38    

Si t'as une version récente de MySQL, et si MySQL supporte les ORDER BY et LIMIT dans des sous requêtes, tu peux tenter : (faut pas avoir peur, c'est aussi rapide qu'une jointure normale)
 

Code :
  1. select c.*, (select i.nom from images i where i.id_collection = c.id_collection order by rand() limit 1)
  2. from collection c
  3. order by collection.nom


 
A supposer que le "RAND()" fonctionne correctement sous SQL Server (ce qui n'est pas le cas), ça marcherait. Par contre, Oracle n'aime pas les ORDER BY dans les sous requêtes. Donc c'est qu'une question de pot...
 
Si ça marche pas, je crains que tu ne sois obligé de faire ça avec une boucle.


Message édité par Arjuna le 26-06-2005 à 23:12:12
Reply

Marsh Posté le 03-07-2005 à 00:38:29    

merci, ca marche terrible ton truc !

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed