Bonjour à tous,
J'ai besoin de votre aide pour créer une requête SQL. J'avoue que mon niveau n'est pas encore assez bon pour faire ce que j'ai en tête.
J'ai deux tables:
"albums" avec les colonnes "id", "nom", "parent-id", "date"
"photos" avec les colonnes "id", "album-id", "img"
La colonne "parent-id" me permet de faire des sous-albums. Ce champ contient l'id de l'album parent. Il vaut NULL si l'album n'est pas un sous-album.
La colonne "album-id" permet de classer la photo dans un album. Ce champ contient l'id de l'album de la table "albums".
Je pourrai avoir des valeurs comme cela:
albums
("id", "nom", "parent-id", "date")
(1, "Mes animaux de compagnies", NULL, "2015-04-13"),
(2, "Mon chat", "1", "2015-04-13"),
(3, "Mon chien", "1", "2015-04-13"),
(4, "Mon rat", "1", "2015-04-13"),
(5, "Un album unique", NULL, "2015-04-14"),
(6, "Un autre album unique", NULL, "2015-04-15");
photos
("id", "album-id", "img")
(1, 2, "mon-chat-01.jpg"),
(2, 2, "mon-chat-02.jpg"),
(3, 2, "mon-chat-03.jpg"),
(4, 3, "mon-chien-01.jpg"),
(5, 3, "mon-chien-02.jpg"),
(6, 4, "mon-rat-01.jpg"),
(7, 5, "une-photo-banale-01.jpg"),
(8, 6, "une-autre-photo-banale-01.jpg"),
(9, 6, "une-autre-photo-banale-02.jpg");
Vous remarquerez qu'un album qui "contient" des sous-albums, n'a pas de photos en relation (aucune ligne de la table "photos" n'a le champ "album-id" qui vaut 1)
C'est maintenant qu'arrive la question:
Comment faire pour récupérer une photo aléatoirement par album? Mais attention, je voudrais que la photo sélectionnée pour l'album id=1 (Mes animaux de compagnies) soit sélectionnée aléatoirement parmi ses sous-albums ("Mon chat", "Mon chien", "Mon rat").
Je voudrais pouvoir présenter sur ma page "galeries photos", une liste des albums avec une photo (celle sélectionnée aléatoirement) en guise de vignette.
Actuellement, j'en suis ici:
"SELECT a.album-id,
(SELECT b.img FROM photos b WHERE a.album-id=b.album-id ORDER BY rand() LIMIT 1) AS "img" FROM photos a
GROUP BY a.album-id"
Mais le problème est que ça me retourne quelque'chose comme ceci:
[2]=> string(xx) "mon-chat-03.jpg"
[3]=> string(xx) "mon-chien-01.jpg"
[4]=> string(xx) "mon-rat-01.jpg"
[5]=> string(xx) "une-photo-banale-01.jpg"
[6]=> string(xx) "une-autre-photo-banale-02.jpg"
alors que je voudrais plutôt ceci:
[1]=> string(xx) "mon-chien-02.jpg" // ou mon-chien-01.jpg, mon-chat-01.jpg, mon-rat-01.jpg ...
[5]=> string(xx) "une-photo-banale-01.jpg"
[6]=> string(xx) "une-autre-photo-banale-02.jpg"
Merci d'avance pour vos réponses!
tu le fait avec du php et un group by
tu boucle sur tes dossiers afin de cherche dans ton resultat SQL une image du bon dossier et paf ca fera des chocapic :D
bon courage a toi
Merci pour vos réponses. Très intéressant le tuto "représentation intervallaire", mais un peu overskilled pour ma petite galerie photos.
Bref, j'ai bossé un peu sur ma requête en re-lisant la doc et je suis arrivé à ça. Peut-être que ça servira à une prochaine personne qui souhaitera afficher des vignettes de façon aléatoire pour les albums de sa galerie.
SELECT albums.id AS album,
(SELECT img FROM photos WHERE photos.album_id = albums.id ORDER BY rand() LIMIT 1) AS img_rand,
(SELECT CASE WHEN albums.parent_id IS NULL THEN albums.id ELSE albums.parent_id END FROM albums WHERE photos.album_id = albums.id LIMIT 1) AS album_parent
FROM albums
INNER JOIN photos ON albums.id = photos.album_id
WHERE YEAR(date) = :y
GROUP BY album_parent