如何选择照片,计数照片,并为每张相册选择一张照片?
问题描述:
我目前正在构建一个自定义照片集,但现在我坚持使用mysql查询。 查询的想法是获取专辑列表,计算其中的图片数量,并获取每个专辑的一个缩略图。如何选择照片,计数照片,并为每张相册选择一张照片?
数据库现在包含两个表格,一个包含专辑数据,另一个包含图片(我将它们存储在数据库中)。
表:photoalbums
id | album_name | album_created
-------------------------------------
1 | testalbum | 2010-11-07 19:33:20
2 | some more | 2010-11-15 18:48:29
表:图片
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
我当前的查询看起来是这样,但显然是行不通的。
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
首先,这个查询会获取相册中的所有缩略图,而我只想要一个(作为预览)。接下来,它似乎停止在一个专辑,我认为这是造成这种情况的GROUP BY声明。
我是否需要为while()循环中的每个专辑执行额外查询以获取每个专辑的单个缩略图,或者我可以只使用一个查询来执行该操作吗?导致只有一张专辑出现在记录集中的错误是什么?
提前致谢!
答
通常情况下,我认为你会希望按SELECT列表中的所有非聚合列进行分组,以获得预期的结果。而这发生在我选择每张专辑一(任意)缩略图的第一种方式会是这样的(未经测试):
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
答
这可能不是答案,但我认为当你别名字段时,你错过了一个AS语句。
从逻辑上讲,这个查询应该工作,虽然我没有测试它:
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
或者你可以做一个子查询:
SELECT thumbnail FROM pictures
WHERE ID IN (SELECT ID FROM phtoalbums)
GROUP BY album_id
虽然它如果不这样做子查询的最佳实践你可以避开它们。
谢谢你,这是解决我的问题! – carlo 2010-11-16 10:18:44