SQL - 每个日期一条记录

jox*_*xxe 4 mysql sql group-by sql-order-by

现在我有以下数据:

        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
Run Code Online (Sandbox Code Playgroud)

以下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 
Run Code Online (Sandbox Code Playgroud)

哪个效果很好,并给我我想要的数据.但是每个唯一日期的数据按每个"日期"的最早日期排序.我希望它按最新订购.Order By语句只是命令整个结果,而不是每天的日期.如果o在使用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
Run Code Online (Sandbox Code Playgroud)

Gar*_*thD 5

使用子查询返回每天的最长时间:

SELECT  MAX(Time) AS Time
FROM    Media
WHERE   Place_ID = 1
GROUP BY CAST(Time AS DATE)
Run Code Online (Sandbox Code Playgroud)

然后将其连接到您的媒体表,将结果限制为每天一个:

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;
Run Code Online (Sandbox Code Playgroud)

这个解决方案的一个重要好处是,主体适用于所有DBMS,而目前MySQL是我所知道的唯一一个支持select语句中不属于聚合函数或包含在group by语句中的列的.我最近在SO上写了另一个答案,描述了MySQL中此功能的潜在危害,以及为什么它在其他DMBS中不受支持.

关于SQLFiddle的示例