我在这里寻找了几种不同的方法来做这件事,但是不能很好地让它起作用。基本上,我有一张表格,上面有添加到网站的图像记录。每张照片都放在这张桌子上。我想从每个不同的添加字段中获取前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/