【问题标题】:How to select first # rows from album and album details如何从相册和相册详细信息中选择前 # 行
【发布时间】:2010-12-13 18:04:59
【问题描述】:

我目前正在为我正在开发的网站开发相册页面,我的想法是创建所有相册的概览,显示最近添加的 5 张图片。相册使用两个 MySQL 表,一个包含相册详细信息(例如:相册名称、相册 ID),另一个包含图片(我将它们作为 blob 存储到数据库中)以及相应的相册 ID。

但是,到目前为止,我还没有找到一个查询,可以让我获取所有相册详细信息以及与相册对应的 5 张最近图片的 ID。希望你能帮帮我。

表格如下所示:

表格:相册

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

在我看来,我需要一个子查询,或者对每个专辑执行一个单独的查询。我宁愿避免使用多个查询..

谁能帮我找到正确的方法来做到这一点?提前致谢。

【问题讨论】:

  • 您是否经常想要所有专辑的列表,以及它们各自最近的 5 张照片?似乎更多时候您只需要特定专辑的 5 张最近的照片。

标签: php mysql


【解决方案1】:

您可能需要考虑创建一个单独的、非规范化的“历史”表,该表会在插入任何新照片的同时插​​入其中,其中包含相册 ID、插入照片的日期以及您添加的所有列可能需要在此历史记录表中显示结果。然后,您可以根据 photo_creation_date 选择此表(我认为相册创建日期对您没有帮助。)

这还有一个额外的好处,就是将您基于照片创建日期运行的任何查询与针对与照片创建日期没有任何关系的照片和相册执行的其他插入/更新/读取操作分开。 IE。为您在相册和图片表上节省了额外的索引。

这确实会花费您额外的存储空间和插入操作,但会提高读取速度。您还必须小心维护历史记录表。照片和相册表的删除/更新/插入也需要更新历史记录表。

【讨论】:

    【解决方案2】:

    试试

    SELECT * FROM pictures LEFT JOIN photoalbums ON (photoalbums.id=pictures.id) ORDER BY album_created DESC
     LIMIT 5
    

    【讨论】:

    • 这不会返回每张专辑的 5 张最近的照片,只返回 5 张最近的照片,按 album 创建排序
    • 但是图片没有日期!
    【解决方案3】:

    如果它只是一张特定专辑的信息,并且如果您在 pictures 表中添加日期修改列,您可以执行以下操作:

    SELECT a.*, p.*
    FROM photoalbums AS a
    LEFT JOIN pictures AS p ON a.id = p.album_id
    WHERE a.id = 1  -- (insert number here)
    ORDER BY p.modified_date
    LIMIT 5
    

    对于所有专辑的 5 个最新图片修改的列表,是的,有一些方法可以制作查询以返回该信息。告诉我,我也会为您做这样的查询。

    【讨论】:

      【解决方案4】:

      虽然我认为您可以使用游标 (q.v. http://dev.mysql.com/doc/refman/5.0/en/cursors.html) 或临时(甚至是永久,如 Macy 建议的)表来完成您所要求的操作,但您必须问自己是否真的有一个好的有理由去那些长度,当四五行 PHP 将做你想要的,以多个更小,更简单的查询为代价。

      您应该记住 KISS 并将其铭记在心。

      【讨论】:

      • 我在考虑临时表。或子查询作弊中的限制。但是,我们同意 - 只需在 php 中使用循环,每个专辑重复 LIMIT 5 次查询,就可以完成。
      【解决方案5】:

      此查询将为您获取所有相册详细信息以及按 ID 降序排列的所有图片,并以逗号分隔的字段形式排列。我只能假设最高的 picture.id 是最新的,因为您没有图片的 date_inserted 列。

      SELECT a.*, GROUP_CONCAT(p.id ORDER BY p.id DESC) as picID FROM photoalbums AS a INNER JOIN pictures AS p ON p.album_id=a.id GROUP BY p.album_id
      

      正如我所说,这将使所有图片按 ID 降序排列。使用 php 应该是一个简单的问题,即在逗号上爆炸并切掉前 5 个 ID。

      我必须感谢您为这个有趣的小项目,但我必须继续前进,不幸的是,仅使用 sql 查询并没有将它准确地放在您想要的位置。

      【讨论】:

        【解决方案6】:

        要一次性完成此操作,您需要在查询运行时以某种方式与父字段相关联。为此,您需要使用一个变量。在这里,我使用变量 x 来保存查询运行时的当前计数。在选择每条记录时,它会决定它当前是否正在处理属于当前父项的记录。如果是这样,它只会在运行总数中增加 0.5。 (我本来试过1,但是好像加了两次1)。

        这是最后的查询。让我知道它是否有帮助。 :-)

        选择 专辑编号, ID, @x := if(@album_id = album_id, @x + 0.5, 1) cnt, @album_id := 专辑 ID 从 图片 通过...分组 专辑编号,编号,cnt 拥有 cnt

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-11-26
          • 2021-11-07
          • 2011-05-10
          • 1970-01-01
          • 2011-12-01
          相关资源
          最近更新 更多