2016-09-15 9 views
1

前に、私は次の表では、私がMySQLの順序は、DAY(タイムスタンプ)をグループ

+-----+------+--------+----------+----------+---------------------+ 
| id | type | dwable | actionby | actionto | time    | 
+-----+------+--------+----------+----------+---------------------+ 
| 256 | 1 | 372 |  5 |  1 | 2016-09-15 13:04:13 | 
| 253 | 1 | 307 |  5 |  1 | 2016-09-15 13:04:12 | 
| 55 | 1 | 416 |  4 |  1 | 2016-09-15 13:04:09 | 
| 38 | 1 | 309 |  4 |  1 | 2016-09-12 13:04:01 | 
| 42 | 1 | 373 |  4 |  1 | 2016-09-10 13:04:08 | 
+-----+------+--------+----------+----------+---------------------+ 

これは、IDを省略を取得しようとしている

CREATE TABLE `uc_likes` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `type` int(255) NOT NULL, 
    `dwable` int(255) NOT NULL, 
    `actionby` int(255) NOT NULL, 
    `actionto` int(255) NOT NULL, 
    `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=257 ; 

INSERT INTO `uc_likes` (`id`, `type`, `dwable`, `actionby`, `actionto`, `time`) VALUES 
(38, 1, 309, 4, 1, '2016-09-12 13:04:01'), 
(41, 1, 372, 4, 1, '2016-09-15 13:04:07'), 
(42, 1, 373, 4, 1, '2016-09-10 13:04:08'), 
(55, 1, 416, 4, 1, '2016-09-15 13:04:09'), 
(253, 1, 307, 5, 1, '2016-09-15 13:04:12'), 
(256, 1, 372, 5, 1, '2016-09-15 13:04:13'); 

SELECT * FROM uc_likes; 
+-----+------+--------+----------+----------+---------------------+ 
| id | type | dwable | actionby | actionto | time    | 
+-----+------+--------+----------+----------+---------------------+ 
| 38 | 1 | 309 |  4 |  1 | 2016-09-12 13:04:01 | 
| 41 | 1 | 372 |  4 |  1 | 2016-09-15 13:04:07 | 
| 42 | 1 | 373 |  4 |  1 | 2016-09-10 13:04:08 | 
| 55 | 1 | 416 |  4 |  1 | 2016-09-15 13:04:09 | 
| 253 | 1 | 307 |  5 |  1 | 2016-09-15 13:04:12 | 
| 256 | 1 | 372 |  5 |  1 | 2016-09-15 13:04:13 | 
+-----+------+--------+----------+----------+---------------------+ 

http://sqlfiddle.com/#!9/62794a

uc_likesと呼ばれている41同じ日の期間(15日)内に同じdwable値を持つ後のエントリをすでに持っているので同様に、id 41の行にタイムスタンプがあると仮定すると、たとえば14日目にタイムスタンプが含まれていなければなりません。他の回答として

は、次のようにグループ化する前に注文するサブクエリを使用して、私が試した示唆している:

SELECT * FROM 
(SELECT * FROM `uc_likes` WHERE `actionto` = 1 ORDER BY time DESC) 
AS t GROUP BY DAY(time), dwable order by time DESC; 

しかし、これはまだID 256上でID 41を選びます。下の結果を参照してください:

+-----+------+--------+----------+----------+---------------------+ 
| id | type | dwable | actionby | actionto | time    | 
+-----+------+--------+----------+----------+---------------------+ 
| 256 | 1 | 372 |  5 |  1 | 2016-09-15 13:04:13 | 
| 253 | 1 | 307 |  5 |  1 | 2016-09-15 13:04:12 | 
| 55 | 1 | 416 |  4 |  1 | 2016-09-15 13:04:09 | 
| 38 | 1 | 309 |  4 |  1 | 2016-09-12 13:04:01 | 
| 42 | 1 | 373 |  4 |  1 | 2016-09-10 13:04:08 | 
+-----+------+--------+----------+----------+---------------------+ 
+0

あなたが例のsqlfiddle(sqlfiddle.com)を作成することを勧めしてください。だから、私たちはあなたの問題を再現することができます。 – geeksal

+0

http://sqlfiddle.com/#!9/62794a @Strawberry – Ben

+0

@geeksal done。私は前にそれを使用したことがないので、私はそれが正しいことを望む。 – Ben

答えて

1

例えば:

SELECT x.* 
    FROM uc_likes x 
    JOIN 
    (SELECT dwable 
      , DATE(time) dt 
      , MAX(time) time 
     FROM uc_likes 
     GROUP 
      BY dwable 
      , dt 
    ) y 
    ON y.dwable = x.dwable 
    AND y.dt = DATE(x.time) 
    AND y.time = x.time; 
+-----+------+--------+----------+----------+---------------------+ 
| id | type | dwable | actionby | actionto | time    | 
+-----+------+--------+----------+----------+---------------------+ 
| 38 | 1 | 309 |  4 |  1 | 2016-09-12 13:04:01 | 
| 42 | 1 | 373 |  4 |  1 | 2016-09-10 13:04:08 | 
| 55 | 1 | 416 |  4 |  1 | 2016-09-15 13:04:09 | 
| 253 | 1 | 307 |  5 |  1 | 2016-09-15 13:04:12 | 
| 256 | 1 | 372 |  5 |  1 | 2016-09-15 13:04:13 | 
+-----+------+--------+----------+----------+---------------------+ 
+0

素晴らしい作品です。編集/質問のヒントを整形していただきありがとうございます。 – Ben

関連する問題