从MySQL中的最后一个条目中选择第二个
问题:需要在指定的时间段内从每个不同票证的最后一个条目中选择第二个条目 示例数据: 查询: 此查询提取:从MySQL中的最后一个条目中选择第二个,mysql,Mysql,问题:需要在指定的时间段内从每个不同票证的最后一个条目中选择第二个条目 示例数据: 查询: 此查询提取: ticket createdate status 111 2015-08-13 04:04:12 bad 然而,再加上许多其他的票,它只会从最后一张票中抽取第二张,我需要它来评估每一张不同的票 我希望我的查询返回: ticket createdate status 111 2015-08-13 04:04:12 bad 115 2015
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
试试这个:
SELECT * FROM my_table ORDER BY rating DESC LIMIT 2,1
像下面这样的方法通常会更快,尤其是在更大的数据集上
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 |
+--------+---------------------+--------+
我觉得我的问题可能无法理解,但它们没有评级。区分序列的唯一方法是通过createdate。我希望表中每个不同票证的倒数第二个。我已经编辑了我的帖子以添加另一列,这说明了为什么我可能需要倒数第二个。考虑到每个都有多个更新的多张票。我需要上一次更新后的第二次更新,因为我的实际表要大得多,所以需要花费很长时间才能运行。我对它进行了一些修改,从ttt.ticket\u num=tt.ticket\u num和ttt.create\u date>=tt.create\u date上的ticket\u文本表中选择了一个连接,所以我不知道为什么要这样做,这对性能没有帮助道歉。。。。在y.ticket=x.ticket和y.createdate>=x.createdate上加入SELECT*FROM ticketTB y我的问题比我给出的要复杂得多。我正试图从根本上解决我的所有问题,我的表和列名是不同的。尽管如此,这还是奏效了!在一张大桌子上跑步需要很长时间,这很好。
SELECT * FROM my_table ORDER BY rating DESC LIMIT 2,1
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 |
+--------+---------------------+--------+