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ステートメントは、各日の日付ではなく、結果全体を並べ替えるだけです。Group Byを使用するときに、最も古い日付ではなく最新の日付を取得できる場合でも、groupby以外の方法を実行する必要があると思います。

編集:以下の作品。しかし、iiはサブクエリからより多くの列を返したいのですが、どうすればよいですか?

    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)

次に、これをメディアテーブルに結合して、結果を1日あたり1つに制限します。

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に適用されることですが、現在、集約関数の一部ではない、またはgroupbyステートメントに含まれていないselectステートメントの列をサポートしているのはMySQLだけです。私は最近、MySQLでのこの機能の潜在的な危険性と、他のDMBSでまだサポートされていない理由を説明するSOに関する別の回答を書きました。

SQLFiddleの例

于 2012-08-07T07:29:01.673 に答える
2

この「GROUPBYtimeORDER BY time DES* C」を「 *GROUPBYDATE ORDER BYtimeDATE」に変更します。データを新しい日付から古い日付に短縮します。

于 2012-08-07T06:11:24.717 に答える
1

ステートメントを部分文字列で少し分割して、TIMEとDATEの両方でORDERBYを分離できるようにします。このようなものが機能するはずです。

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 に答える