2012-08-07 57 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