1

我在这里搜索了几种不同的方法来做到这一点,但不能完全让它发挥作用。基本上,我有一个表格,其中记录了添加到网站的图像。每个图像都放入此表中。我想从每个不同的已添加字段中获取前 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
4

3 回答 3

3

在许多其他 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)足够了。

于 2013-08-31T01:06:07.863 回答
1

它不是一个漂亮的查询,但这样的事情应该可以

select pictures.*
from pictures
inner join
(
  select id
  from pictures
  group by added
  order by added desc
  limit 5
) as galleries
on pictures.added = galleries.added
order by pictures.id desc

where
  (select count(0) from pictures as ip where ip.added = pictures.added and ip.id > pictures.id) >= 5
于 2013-08-31T00:09:23.760 回答
0

您的选择查询应如下所示:

mysql_query("SELECT * FROM tablename LIMIT 5 ORDER BY ID DESC");

基本上,您按降序选择最后 5 个结果。

我建议您使用 MySQLi 或 PDO 而不是 MySQL

于 2013-08-30T23:17:28.737 回答