2010-11-15 9 views
1

Je suis en train de construire un album photo personnalisé mais maintenant je suis coincé avec une requête mysql. L'idée de la requête est d'extraire une liste d'albums, de compter le nombre d'images qu'elle contient et d'extraire une vignette par album.Comment sélectionner les album photos, compter les photos et sélectionner une photo par album?

La base de données se compose maintenant de deux tables, l'une contenant les données de l'album et l'autre contenant les images (je les stocke dans la base de données).

Tableau: Photoalbums

id | album_name | album_created 
------------------------------------- 
1 | testalbum | 2010-11-07 19:33:20 
2 | some more | 2010-11-15 18:48:29 

Tableau: images

id | file | thumbnail | name | album_id 
------------------------------------------ 
1 | binary | binary | test1 | 1 
2 | binary | binary | test2 | 1 
3 | binary | binary | test3 | 2 
4 | binary | binary | test4 | 2 
5 | binary | binary | test5 | 1 

Ma requête actuelle ressemble à cela, mais clairement ne fonctionne pas.

SELECT alb.id album_id, alb.album_name, alb.album_created, COUNT(p.id) pcount FROM photoalbums alb LEFT JOIN pictures p ON p.album_id=alb.id GROUP BY p.album_id ORDER BY alb.album_name ASC 

Tout d'abord, cette requête allait chercher toutes les vignettes dans l'album, et je ne veux qu'une seule (en avant-première). Ensuite, il semble s'arrêter à un album et je pense que c'est la déclaration GROUP BY qui en est la cause. Ai-je besoin d'effectuer une requête supplémentaire pour chaque album dans la boucle while() pour aller chercher une seule vignette par album, ou puis-je le faire avec une seule requête? Et quelle est l'erreur provoquant l'apparition d'un seul album dans le jeu d'enregistrements?

Merci d'avance!

Répondre

1

Typiquement, je pense que vous voudriez regrouper par toutes les colonnes non agrégées dans la liste SELECT afin d'obtenir les résultats attendus. Et la première façon qui me vient de sélectionner une vignette (arbitraire) par album serait comme ceci (non testé):

SELECT alb.id AS album_id, alb.album_name, alb.album_created, 
     COUNT(p.id) AS pcount, 
     MAX(p.thumbnail) AS thumbnail 
FROM photoalbums alb 
LEFT JOIN pictures p ON p.album_id=alb.id 
GROUP BY alb.id, alb.album_name, alb.album_created 
ORDER BY alb.album_name ASC 
+0

Merci, ceci est la solution à ma question! – carlo

0

Cela peut ne pas être la réponse, mais je pense qu'il vous manque une instruction AS lorsque vous alias vos champs.

Logiquement, cette requête devrait fonctionner, même si je ne l'ai pas testé:

SELECT photoalbums.ID, photoalbums.Name, photoalbums.Created, Count(photoalbums.ID) AS pCount 
FROM photoalbums 
INNER JOIN pictures ON pictures.album_id = photoalbums.id 
GROUP BY pictures.album_id 
ORDER BY photoalbums.album_name ASC 

Ou vous pouvez faire une sous requête:

SELECT thumbnail FROM pictures 
WHERE ID IN (SELECT ID FROM phtoalbums) 
GROUP BY album_id 

Bien qu'il soit la meilleure pratique de ne pas faire les sous-requêtes si vous pouvez les éviter.

Questions connexes