2016-09-15 65 views
1

组之前,我有以下的表称为uc_likesmysql命令由DAY(时间戳)

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

我试图让

+-----+------+--------+----------+----------+---------------------+ 
| 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 41因为它在同一天期间(15日)已经具有相同的dwable值的较晚的条目。同样假设,如果编号为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 41了ID 256。看看下面的结果:

+-----+------+--------+----------+----------+---------------------+ 
| 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完成。我以前从未使用过它,所以我希望我做对了。 – 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