2012-08-07 77 views
4

一個記錄現在即時通訊具有下列數據:SQL - 每日期

 Name   Time 

     picture 2012-07-23 17:00:00 
     picture 2012-07-24 18:00:00 
     picture 2012-07-24 19:00:00 
     picture 2012-08-03 08:40:06 
     picture 2012-08-03 08:42:39 
     picture 2012-08-03 08:54:03 
     picture 2012-08-03 10:38:58 
     picture 2012-08-03 10:39:55 
     picture 2012-08-06 08:12:14 

而且下面的SQL查詢:

SELECT DATE_FORMAT(DATE(DATE_SUB(time,INTERVAL 4 HOUR)),GET_FORMAT(DATE,'ISO')) 
    as time, uri, media_id, description 
    FROM media WHERE place_id = 1 
    GROUP BY time ORDER BY time DESC 

效果很好,給我我想要的數據。 但是,每個獨特日期的數據按每個「日」的最早日期排序。我想要它由最新訂購。 Order By聲明只是排序整個結果,而不是每天的日期。如果o使用Group By時可以採用最新的日期而不是最早的日期,但是我猜想除了group by之外,我還得設計其他的東西。

編輯:下面的作品。但我想從子查詢中返回更多列,我該怎麼做?

SELECT Distinct DATE_FORMAT(DATE(DATE_SUB(time, INTERVAL 4 HOUR)) , 
    GET_FORMAT(DATE, 'ISO')) AS date, 
      (SELECT type FROM media WHERE 
      DATE_FORMAT(DATE(DATE_SUB(time, INTERVAL 4 HOUR)) , 
      GET_FORMAT(DATE,'ISO')) = date Order by time DESC Limit 1) as name 
    FROM media 
+1

GROUP按時間倒序按時間倒序? – imm 2012-08-07 06:03:34

+0

問題是Group By不是一個排序函數。所以它沒有區別。我想我需要一個子查詢。 – joxxe 2012-08-07 06:17:57

+0

我的不好。 MySQL文檔似乎暗示你可以做到這一點。即,在此頁面上:http://dev.mysql.com/doc/refman/5.0/en/select.html ...所以如果它不這樣做,我會對ASC | DESC感興趣是通過 – imm 2012-08-07 06:21:31

回答

5

使用子查詢返回的最大時間的每一天:

SELECT MAX(Time) AS Time 
FROM Media 
WHERE Place_ID = 1 
GROUP BY CAST(Time AS DATE) 

然後加入這一回媒體表的結果限制爲每天一個:

SELECT Type AS Name, 
     DATE_FORMAT(DATE(DATE_SUB(Media.time, INTERVAL 4 HOUR)), GET_FORMAT(DATE, 'ISO')) AS Time, 
     uri, 
     media_id, 
     description 
FROM Media 
     INNER JOIN 
     ( SELECT MAX(Time) AS Time 
      FROM Media 
      WHERE Place_ID = 1 
      GROUP BY CAST(Time AS DATE) 
     ) MaxTime 
      ON MaxTime.Time = Media.Time; 

這種解決方案的一個巨大的好處是,主要適用翻過所有DBMS,wher目前MySQL是我知道的唯一支持select語句中不屬於聚合函數或包含在group by語句中的列。我最近寫了another answer on SO描述了這個功能在MySQL中的潛在危害,以及爲什麼它在其他DMBS中還不被支持。

Example on SQLFiddle

+0

哇!謝謝!它工作得很好。我有一個自己的解決方案,它爲每一列做了一個子查詢。它的工作,但沒有那麼高效。 你的解決方案好得多:) – joxxe 2012-08-07 07:35:23

1

使用子字符串輕微分解您的語句,以便您在TIME和DATE分別具有ORDER BY。像這樣的東西應該工作;

SELECT DATE_FORMAT(DATE(DATE_SUB(time,INTERVAL 4 HOUR)),GET_FORMAT(DATE,'ISO')) 
as time, uri, media_id, description 
FROM media WHERE place_id = 1 
GROUP BY time ORDER BY SUBSTRING(time,1,10) DESC, SUBSTRING(time,12,8) ASC 
+0

我不清楚你的桌子上有什麼與衆不同的列,但如果DATE和TIME是單獨的值,那麼爲什麼你不能試着調整你的語句來做'按日期降序,時間ASC' – 2012-08-07 06:27:37

+0

對不起,不清楚,看我的編輯。 – joxxe 2012-08-07 06:32:04

+0

您是否嘗試了我在原始查詢中建議的SUBSTRING? – 2012-08-07 06:45:06

2

改變這種 「GROUP BY時間ORDER BY時間DES * C」 爲 「 * GROUP BY DATE ORDER BY時間日期」。它將數據從新的日期縮短到舊的。

1

試試這個:

SELECT time,DATE_FORMAT(DATE(DATE_SUB(time,INTERVAL 4 HOUR)), 
     GET_FORMAT(DATE,'ISO')) as date, uri, media_id, description 
    FROM media WHERE place_id = 1 
    ORDER BY date DESC ,time desc