我在这里寻找了几种不同的方法来做这件事,但是不能很好地让它起作用。基本上,我有一张表格,上面有添加到网站的图像记录。每张照片都放在这张桌子上。我想从每个不同的添加字段中获取前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中的每个图像都有一个上传日期('Added'),该日期与库相对应,因为我一次只上传一个库中的图像,并且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子句:
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)上的索引就足够了。

关于php - MYSQL为最后5个不同的记录选择5个记录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18542749/

10-12 19:21