簡體   English   中英

從MySQL中的最后一個條目中選擇第二個

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM