簡體   English   中英

按日期排列ASC,但按組中的DESC

[英]Order by date ASC, but DESC within group

我有兩張桌子。 想象第一個是目錄,其中包含許多文件(第二個表)。

第二個表(文件)包含一個modification_date。

現在,我要選擇“所有目錄”,並按其修改日期ASC(因此,最新的修改為最高)對它們進行排序。 我只想顯示最舊的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

這使我所有文件都按其修改順序排列(最新的最頂部)-現在,我想對文件夾中的文件進行分組,以僅看到最舊的修改(它們具有“可見”屬性,但是考慮到這沒什么大不了的,因此看到修改后,將顯示第二個最舊的,依此類推...)

如何將結果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)

有什么建議么?

一種簡單的方法是使用子查詢。

范例:

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這應該可以幫助您解決問題問題。

但是您也可以創建如下臨時表:

祝您項目順利。

一種方法是獲取每個目錄的最大日期列表,然后將查詢加入該列表:

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訪問權限,所以我擔心這未經測試,但這是一般的想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM