2010-11-15 98 views
1

我目前正在构建一个自定义照片集,但现在我坚持使用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()循环中的每个专辑执行额外查询以获取每个专辑的单个缩略图,或者我可以只使用一个查询来执行该操作吗?导致只有一张专辑出现在记录集中的错误是什么?

提前致谢!

回答

1

通常情况下,我认为你会希望按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 
+0

谢谢你,这是解决我的问题! – carlo 2010-11-16 10:18:44

0

这可能不是答案,但我认为当你别名字段时,你错过了一个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 

虽然它如果不这样做子查询的最佳实践你可以避开它们。