【问题标题】:Display album cover for all photo gallery albums显示所有相册相册的相册封面
【发布时间】:2014-09-27 23:19:50
【问题描述】:

我有一个相册,允许用户创建个人相册。 我可以这样显示每张专辑的名称。

$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 ;");

这是我得到的结果:

这是我想要达到的结果:

我希望每个相册名称都显示为每个相册的最后一张照片作为封面照片。

如果我在查询中添加 LIMIT 1,则只会显示一张专辑。

这是我通过外键连接在一起的表。

专辑列表:

画廊表:

任何解决此问题的解决方案将不胜感激。

【问题讨论】:

  • 如果您有 gallery.file_name,您可能需要将其替换为子查询以检索您想要的图像。
  • @jeff 你介意给我看一个如何编写子查询的例子吗?不必使用我的查询。感谢您的帮助。
  • SELECT 项目,(从 y=1 限制 1 的 x 中选择项目)从 s=10 的地方。子查询只能返回一个值。
  • 您的相册保存在目录中对吗?如果是这样,为什么不按创建日期和时间选择最后一个文件——类似的问题在这里——stackoverflow.com/questions/12184619/…
  • ORDER BY gallery.id AND gallery.id DESC - 看起来有点搞笑

标签: php mysql


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

如果您想选择空相册以及包含一张或多张图片的相册,请将 INNER JOIN 更改为 LEFT JOIN。

【讨论】:

  • 完美!非常感谢你的帮助。问题是,如果我需要通过 Random 来组织图像并且我添加了 ORDER BY g.id RAND () LIMIT 1 这不起作用。我该怎么做才能让它工作?再次感谢。
  • 专辑也是这样的ASC:Album 1, Album 2, Album 3,图像是DESC。我怎样才能使专辑像 Album 3, Album 2, Album 1 一样是 DESC,而图像是 DESC 或 RAND()?
  • 尽量避免这种子查询。对于在相册中找到的每一行 * 对于在画廊中找到的每一行,都会执行子查询。
  • 我更新了我的答案以演示按日期对相册进行排序,并重新设计了查询以支持在每个相册中选择随机图像。该查询也应该执行得更好,因为它不再连接子查询。 :)
【解决方案2】:

试试这个:

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 之后没有,

【讨论】:

  • 我试过你的方法,但给了我错误,什么也没显示。不过会尝试处理它。可能是用户错误哈哈。
  • 我尝试了几种变体,但似乎不起作用。我不明白为什么我需要'mydefaultimage.jpeg' ..?我希望每张专辑的封面是每张专辑中最后上传的图片。
  • 此查询将仅返回一行,因为 LIMIT 子句适用于整个查询。要按预期工作,LIMIT 必须仅适用于 JOIN 表达式。 COALESCE 的目的是为左连接图库表中没有任何行的专辑提供默认图像文件(而不是NULL)。或者,可以使用 INNER JOIN 仅选择包含一个或多个图像的相册。
【解决方案3】:

试试这个:

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`

【讨论】:

  • 我创建了表格并用您提供的数据填充它们。它起作用了,所以肯定有其他原因导致它不起作用。
  • 这两个表之间是否存在具有外键的关系?我对外键很陌生,所以也许这就是问题所在。
【解决方案4】:

首先要确定每个相册的图片的最新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)

【讨论】:

    【解决方案5】:

    解决方案:

    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....)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-31
      • 2016-08-30
      • 2015-02-28
      • 1970-01-01
      相关资源
      最近更新 更多