4

现在我有以下数据:

        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
4

4 回答 4

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,而目前 MySQL 是我所知道的唯一支持 select 语句中不属于聚合函数或包含在 group by 语句中的列。我最近写了另一个关于 SO 的答案,描述了 MySQL 中这个功能的潜在危害,以及为什么其他 DMBS 还不支持它。

SQLFiddle 上的示例

于 2012-08-07T07:29:01.673 回答
2

将此“ GROUP BY time ORDER BY time DES* C”更改为“ *GROUP BY DATE ORDER BY time DATE ”。它会将数据从新日期缩短到旧日期。

于 2012-08-07T06:11:24.717 回答
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
于 2012-08-07T06:10:25.123 回答
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
于 2012-08-07T06:19:51.003 回答