我在这里搜索了几种不同的方法来执行此操作,但是还不能完全正常工作。基本上,我有一张桌子,上面记录着添加到网站上的图像。每个图像都放在此表中。我想从每个不同的“已添加”字段中获取前5张图像。
因此,该表可能如下所示:
ID File Folder Added ---------------------------------- 13 13.jpg Event3 20130830 12 12.jpg Event3 20130830 11 11.jpg Event3 20130830 10 10.jpg Event3 20130830 9 9.jpg Event3 20130830 8 8.jpg Event2 20130701 7 7.jpg Event2 20130701 6 6.jpg Event2 20130701 5 5.jpg Event2 20130701 4 4.jpg Event1 20130615 3 3.jpg Event1 20130615 2 2.jpg Event1 20130615 1 1.jpg Event1 20130615
我希望回报是这样的:
ID File Folder Added ---------------------------------- 13 13.jpg Event3 20130830 12 12.jpg Event3 20130830 8 8.jpg Event2 20130701 7 7.jpg Event2 20130701 4 4.jpg Event1 20130615 3 3.jpg Event1 20130615
因此,基本上可以获取最后5个不同的“添加”日期的“最后5张”(按ID最高的优先顺序排序)图像(再次通过“添加”字段对最新日期进行排序)。谢谢!
编辑 - - - - - - - -
因此,它更清晰了……我有一张桌子,上面有一张我上载到基于图像的网站的图像。对于网站的前端,我希望有一个新闻摘要,显示最近上传了图像的5个画廊,并显示每个画廊的5个图像。mysql中的每个图像都有一个上载日期(“添加”),该日期与图库相对应,因为我一次只将图像上载到一个图库中,并且ID编号随添加的每个图像自动增加(“ ID”) 。当然还有很多其他领域,但是对于我想做的事情来说,那些是最重要的领域。
编辑#2 ----------
我对此措辞有很多困惑,很难解释,但是基本上我如何从表中获得5个不同的添加日期字段的5个最高ID字段?
我相信它与此有关,但是在我运行它时却不起作用:
select TOP 5 * from ( select *, row_no = row_number() over (partition by Added order by ID) from AviationImages) d where d.row_n <= 5
在许多其他DBMS(Oracle,SQL-Server,Postgres)中,可以使用窗口函数:
SELECT id, file, folder, added FROM ( SELECT id, file, folder, added, DENSE_RANK() OVER (ORDER BY added DESC) AS d_rank, ROW_NUMBER() OVER (PARTITION BY added ORDER BY id DESC) AS row_no FROM AviationImages ) d WHERE d_rank <= 5 -- limit number of dates AND row_no <= 5 ; -- limit number of images per date
在MySQL中,您没有窗口函数和OVER子句的奢侈:
OVER
SELECT i.id, i.file, i.folder, i.added FROM ( SELECT DISTINCT added FROM AviationImages ORDER BY added DESC LIMIT 5 ) AS da JOIN AviationImages AS i ON i.added = da.added AND i.id >= COALESCE( ( SELECT ti.id FROM AviationImages AS ti WHERE ti.added = da.added ORDER BY ti.id DESC LIMIT 1 OFFSET 4 ), -2147483647) ; -- use 0 if the `id` is unsigned int
索引打开(added, id)将有助于提高效率-如果表使用InnoDB并且id为主键,则仅索引打开(added)就足够了。
(added, id)
id
(added)