0

我有两张桌子。想象第一个是一个目录,包含很多文件(第二个表)。

第二个表(文件)包含一个修改日期。

现在,我想选择所有目录并按其修改日期 ASC 对它们进行排序(因此,最新的修改最上面)。而不是显示该文件夹,我只想显示最旧的 Mofified 文件(因此,修改 DESC,按文件夹 ID 分组)

按修改日期对所有文件进行排序是没有问题的。

我的查询看起来(简化)是这样的:

SELECT 
  f.*,
  d.* 
FROM 
  files f
LEFT JOIN
  directories d
ON 
  f.directory_id = d.id
ORDER BY
  f.modification_date DESC

这给了我所有文件的修改顺序(最新的最上面) - 现在,我想在一个文件夹中对文件进行分组,只看到最旧的修改(他们有“看到”的属性,但考虑到这一点没什么大不了的,所以一旦看到修改,将显示第二旧的,等等......)

我如何对结果进行排序by modification_date DESC,但也可以modification_date ASC在 Grouping 之后对其进行排序?

例子:

目录:

id | name 
1    Folder 1
2    Folder 2

文件

id | Name | d_id | modification_datee
1    f1     1       2008-01-01
2    f2     1       2011-01-01
3    f3     2       2013-01-01
4    f4     2       2010-01-01

结果我想要:

f4 (cause directory 2 contains the NEWEST modification (2013), but f4 is the oldest out of that folder)
f1 (cause directory 1 contains the SECOND newest modification, but f1 is the oldest out of that folder)

有什么建议么?

4

2 回答 2

0

一种简单的方法是使用子查询。

例子 :

选择
d.*,
(
 选择 f.id
 FROM 文件
 其中 f.directory_id=d.id
 按 f.modification_date DESC 排序
 限制 1
)
FROM 目录 d
ORDER BY d.modification_date ASC

但这只会给您文件的 id,您必须发出另一个请求才能获取每个文件的信息。

另一种方法可能是使用 HAVING 语句(参见http://dev.mysql.com/doc/refman/5.0/en/group-by-extensions.html)。

通过搜索 HAVING 示例,我发现了这个:http ://www.sitepoint.com/forums/showthread.php?535271-Group-by-ID-having-MAX%28date%29-problem 这应该可以帮助您解决您的问题问题。

但您也可以像这样创建临时表:

祝你的项目好运。

于 2013-08-12T19:45:21.887 回答
0

一种方法是获取每个目录的最大日期列表,然后将您的查询加入该列表:

SELECT
  d.name,
  f.name,
  f.modifiction_date
FROM (
  SELECT
    d_id,
    MAX(modification_date) AS MaxMod
  FROM files
  GROUP BY d_id
) LatestFiles
INNER JOIN Files f ON
  LatestFiles.d_id = f.d_id AND
  LatestFiles.MaxMod = f.modification_date
INNER JOIN directories d ON f.d_id = d.id

我今天没有 MySQL 访问权限,所以恐怕这是未经测试的,但这是一般的想法。

于 2013-08-12T19:46:27.187 回答