【问题标题】:How to select photoalbums, count photo's, and select one photo per album?如何选择相册、统计照片、每个相册选择一张照片?
【发布时间】:2011-05-10 12:13:33
【问题描述】:

我目前正在构建一个自定义相册,但现在我遇到了一个 mysql 查询。 查询的想法是获取相册列表,计算其中的图片数量,然后为每个相册获取一个缩略图。

数据库现在由两张表组成,一张包含专辑数据,一张包含图片(我将它们存储在数据库中)。

表格:相册

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() 循环中为每个专辑执行额外的查询以获取每个专辑的单个缩略图,或者我可以只使用单个查询来完成吗?导致只有一张专辑出现在记录集中的错误是什么?

提前致谢!

【问题讨论】:

    标签: mysql


    【解决方案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
    

    【讨论】:

    • 谢谢,这是我问题的解决方案!
    【解决方案2】:

    这可能不是答案,但我认为您在为字段设置别名时缺少 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
    

    如果可以避免子查询,最好不要进行子查询。

    【讨论】:

      猜你喜欢
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-24
      • 2015-12-21
      • 1970-01-01
      • 1970-01-01
      • 2016-07-04
      相关资源
      最近更新 更多