我有两张桌子。想象一下,第一个是一个包含大量文件的目录(第二个表)。
第二个表(文件)包含modification_date。
现在,我想选择所有目录并按其修改日期ASC对它们进行排序(所以,最新的 修改最顶层)。而不是显示该文件夹,我只想显示OLDEST Mofified文件(因此,修改DESC,按folder_id分组)
按修改日期排序所有文件没问题。
我的查询看起来(简化)如下:
SELECT
f.*,
d.*
FROM
files f
LEFT JOIN
directories d
ON
f.directory_id = d.id
ORDER BY
f.modification_date DESC
这给了我修改顺序中的所有文件(最新的最顶层) - 现在,我想在文件夹中分组文件,只看到OLDEST修改(他们有“看到”属性,但考虑到这一点并不大交易,所以一旦看到修改,将显示第二个最旧的,等等...)
如何对结果by modification_date DESC
进行排序,还可以在对其进行分组后按modification_date ASC
对其进行排序?
示例:
目录:
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)
有什么建议吗?
答案 0 :(得分:0)
一种简单的方法是使用子查询。
示例:
SELECT d.*, ( SELECT f.id FROM files f WHERE f.directory_id=d.id ORDER BY f.modification_date DESC LIMIT 1 ) FROM directories 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 这应该可以帮助您解决问题。
但你也可以像这样创建临时表:
祝你的项目好运。
答案 1 :(得分: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访问权限,所以我担心这是未经测试的,但这是一般的想法。