我正在为我正在制作的网站开发一个photoalbum页面,我的想法是创建所有photoalbums的概述,显示最近添加的5张图片。 photoalbum使用两个MySQL表,一个包含专辑详细信息(例如:专辑名称,专辑ID),另一个包含图片(我将它们作为blob存储到数据库中)以及相应的专辑ID。
但是,我无法找到一个查询,这个查询允许我获取所有相册详细信息以及与相册相对应的5张最新照片的ID。我希望你能帮助我一点。
表格如下:
表: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
在我看来,我需要一个子查询,或者为每个专辑执行单独的查询。我宁愿避免使用多个查询..
有人能帮我找到正确的方法吗?提前谢谢。
答案 0 :(得分:1)
您可能需要考虑创建一个单独的,非规范化的“历史记录”表格,该表格会在插入任何新照片的同时插入,其中包含相册ID,插入照片的日期以及任何列可能希望在此历史记录表中显示结果。然后,您可以根据 photo_creation_date 选择此表格(我认为专辑创建日期不会对您有帮助。)
这样做的另一个好处是可以根据照片创建日期分离您运行的任何查询,以及针对与照片创建日期无关的照片和相册执行的其他插入/更新/读取操作。 I.E.在photoalbum和图片表上保存额外的索引。
这会花费您额外的存储空间和插入操作,但会带来更快的读取速度。您还必须小心维护历史记录表。删除/更新/插入照片和photoalbum表也需要更新历史记录表。
答案 1 :(得分:0)
尝试
SELECT * FROM pictures LEFT JOIN photoalbums ON (photoalbums.id=pictures.id) ORDER BY album_created DESC
LIMIT 5
答案 2 :(得分:0)
如果只是一个特定专辑的信息,并且在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个最新图片修改的列表,那么是有方法来制作查询以返回该信息。让我知道,我也会为你做一个类似的查询。
答案 3 :(得分:0)
虽然我认为您可以使用游标(qv http://dev.mysql.com/doc/refman/5.0/en/cursors.html)或临时(甚至是Macy建议的永久性)表来执行您所要求的操作,但您必须问自己是否真的有这是一个很好的理由,当四到五行PHP可以做你想要的时候,代价是多个更小,更简单的查询。
你要记住KISS并在心里保持圣洁。
答案 4 :(得分:0)
此查询将为您提供所有相册详细信息以及按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查询,它并没有完全得到它。
答案 5 :(得分:0)
要在单个传递中执行此操作,您需要在查询运行时以某种方式与父字段关联。为此,您需要使用变量。在这里,我使用变量x来保存查询运行时的当前计数。在选择每条记录时,它会决定它当前是否正在处理属于当前父级的记录。如果是这样的话,只需在运行总计中加0.5。 (我最初尝试过1,但似乎1加了两次)。
这是最终查询。如果有帮助,请告诉我。 : - )
选择 album_id, ID, @x:= if(@album_id = album_id,@ x + 0.5,1)cnt, @album_id:= album_id 从 图片 通过...分组 album_id,id,cnt HAVING cnt< = 5;