admin

MYSQL为最后5个不同的记录选择5个记录

sql

我在这里搜索了几种不同的方法来执行此操作,但是还不能完全正常工作。基本上,我有一张桌子,上面记录着添加到网站上的图像。每个图像都放在此表中。我想从每个不同的“已添加”字段中获取前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

阅读 161

收藏
2021-07-01

共1个答案

admin

在许多其他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子句的奢侈:

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)就足够了。

2021-07-01