显示所有照片库相册的专辑封面

时间:2014-09-27 23:19:50

标签: php mysql

我有一个照片库,我允许用户创建单独的相册。 我可以像这样显示每张专辑的名称。

$album = DB::getInstance()->query("SELECT `album_id`,`album_date`,`album_title` FROM `albums` ORDER BY `album_date` DESC");

我要做的是为每张专辑添加封面照片,但似乎无法使我的查询正确无误。 这就是我正在尝试的。

$album = DB::getInstance()->query("SELECT
albums.album_id,
albums.created,
albums.album_date,
albums.album_title,
gallery.file_name,
gallery.id,
gallery.album_id
FROM
albums
INNER JOIN gallery ON gallery.album_id = albums.album_id ORDER BY gallery.id DESC ;");

这是我得到的结果:

enter image description here

这是我想要实现的结果:

enter image description here

我希望每张专辑名称与每张专辑中的最后一张照片一起显示为封面照片。

如果我在查询中添加LIMIT为1,则只会显示一个相册。

以下是我用外键加入的表格。

相册表:

enter image description here

图库表:

enter image description here

任何解决这个问题的方法都会非常感激。

5 个答案:

答案 0 :(得分:1)

您可以使用以下查询选择每个相册中的最新图像:

SELECT album_id, MAX(id) id
FROM gallery
GROUP BY album_id

或者,您可以在每个相册中选择一个随机图像,如下所示:

SELECT g.album_id, (
    SELECT id FROM gallery g2
    WHERE g2.album_id = g.album_id
    ORDER BY RAND()
    LIMIT 1
) id
FROM gallery g
GROUP BY g.album_id

上述任何一个查询都可以插入完整的查询中:

SELECT a.album_id, a.created, a.album_date, a.album_title,
       g.file_name, g.id, g.album_id
FROM albums a
INNER JOIN (
    # above query goes here
) alb_img USING (album_id)
INNER JOIN gallery g ON g.id = alb_img.id
ORDER BY a.album_date DESC;

如果您想要选择空白相册以及包含一个或多个图像的相册,请将内部连接更改为左连接。

答案 1 :(得分:0)

尝试一下:

SELECT album_id, album_name, title, COALESCE(file_name, 'mydefaultimage.jpeg') 
  FROM albums
  LEFT JOIN gallery on album_id = album 
  ORDER BY added DESC
  LIMIT 1,1

如果没有图像,标题将为null,文件名将包含默认图像名称。

<强> [编辑] ,

之后没有DESC

答案 2 :(得分:0)

试试这个:

SELECT
    `album`.`album_title`
    , (SELECT file_name FROM gallery WHERE gallery.`album_id` = album.`album_id` ORDER BY file_name DESC LIMIT 1) AS file_name
FROM
    `album`

答案 3 :(得分:0)

要做的第一件事是为每张专辑确定图像的最新ID:

SELECT album_id, MAX(id) id FROM gallery GROUP BY album_id

您可以轻松地将其作为内联视图(子查询)放在查询中

SELECT
    a.album_name, g.file_name, g.title
FROM
    (SELECT album_id, MAX(id) id FROM gallery GROUP BY album_id) a
JOIN
    gallery g USING (album_id, id)
JOIN
    albums a USING (album_id)

答案 4 :(得分:0)

<强>解决方案:

SELECT albums.album_id,
       albums.album_title,
       albums.album_date,
       albums.created,
       gallery.id,
       gallery.file_name
FROM `albums`
LEFT JOIN `gallery` ON (albums.album_id = gallery.album_id)
WHERE gallery.id IN
    ( SELECT MAX(gallery.id)
     FROM `gallery`
     GROUP BY gallery.album_id)

<强>解释

您首先需要从gallery表格中选择与每张专辑相对应的最新记录。使用album_id字段对记录进行分组,并使用聚合函数MAX()来获取分组结果中ID最大的记录。

SELECT MAX(gallery.id)
     FROM `gallery`
     GROUP BY gallery.album_id

然后将gallery表与albums表一起加入LEFT JOIN,并在WHERE子句中使用上述查询的结果。您可以在外部查询的SELECT部分中指定需要使用的整个字段集

SELECT albums.album_id,
       albums.album_title,
       albums.album_date,
       albums.created,
       gallery.id,
       gallery.file_name
FROM `albums`
LEFT JOIN `gallery` ON (albums.album_id = gallery.album_id)
WHERE gallery.id IN
    ( FIRSTQUERY....)