[英]Select 2nd From Last Entry In MySQL
问题 :在指定时间段内,每个不同票证的倒数第二次需要
示例数据 :
ticketTB
ticket createdate status
111 2015-08-13 04:05:12 good
111 2015-08-13 04:04:12 bad
111 2015-08-13 04:03:12 good
115 2015-08-13 03:05:12 good
115 2015-08-13 03:04:12 bad
115 2015-08-13 03:03:12 good
查询 :
SELECT ticket, status, createdate FROM ticketTB GROUP BY ticket ORDER BY createdate DESC LIMIT 1,1;
该查询提取:
ticket createdate status
111 2015-08-13 04:04:12 bad
但是,添加许多其他票证只会使我需要它来评估每个不同票证的所有票务中的第二个倒数。
我希望查询返回:
ticket createdate status
111 2015-08-13 04:04:12 bad
115 2015-08-13 03:04:12 bad
DROP TABLE IF EXISTS ticketTB;
CREATE TABLE ticketTB
(ticket INT NOT NULL
,createdate DATETIME NOT NULL
,status VARCHAR(12)
,PRIMARY KEY(ticket,createdate)
);
INSERT INTO ticketTB VALUES
(111 ,'2015-08-13 04:05:12','good'),
(111 ,'2015-08-13 04:04:12','bad'),
(111 ,'2015-08-13 04:03:12','good'),
(111 ,'2015-08-13 04:02:12','good'),
(115 ,'2015-08-13 03:05:12','good'),
(115 ,'2015-08-13 03:04:12','bad'),
(115 ,'2015-08-13 03:03:12','good'),
(115 ,'2015-08-13 03:02:12','good');
SELECT * FROM ticketTB;
+--------+---------------------+--------+
| ticket | createdate | status |
+--------+---------------------+--------+
| 111 | 2015-08-13 04:02:12 | good |
| 111 | 2015-08-13 04:03:12 | good |
| 111 | 2015-08-13 04:04:12 | bad |
| 111 | 2015-08-13 04:05:12 | good |
| 115 | 2015-08-13 03:02:12 | good |
| 115 | 2015-08-13 03:03:12 | good |
| 115 | 2015-08-13 03:04:12 | bad |
| 115 | 2015-08-13 03:05:12 | good |
+--------+---------------------+--------+
SELECT x.*
FROM ticketTB x
JOIN ticketTB y
ON y.ticket = x.ticket
AND y.createdate >= x.createdate
GROUP
BY ticket
, createdate
HAVING COUNT(*) = 2;
+--------+---------------------+--------+
| ticket | createdate | status |
+--------+---------------------+--------+
| 111 | 2015-08-13 04:04:12 | bad |
| 115 | 2015-08-13 03:04:12 | bad |
+--------+---------------------+--------+
类似于以下方法,通常会更快,尤其是在较大的数据集上。
SELECT ticket
, createdate
, status
FROM
( SELECT *
, CASE WHEN @prev = ticket THEN @i:=@i+1 ELSE @i:=1 END rank
, @prev := ticket prev
FROM ticketTB
, (SELECT @prev:='',@i:=1) vars
ORDER
BY ticket
, createdate DESC
) x
WHERE rank = 2;
+--------+---------------------+--------+
| ticket | createdate | status |
+--------+---------------------+--------+
| 111 | 2015-08-13 04:04:12 | bad |
| 115 | 2015-08-13 03:04:12 | bad |
+--------+---------------------+--------+
尝试这个:
SELECT * FROM my_table ORDER BY rating DESC LIMIT 2,1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.