문제 : 지정된 기간 내에 각 개별 티켓의 마지막 항목에서 두 번째가 필요합니다.
예제 데이터 :
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 |
+--------+---------------------+--------+
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다