更改答案,我忘了通過timestamp1訂購,下面是會照顧的最終版本多名員工:) sqlFiddle
SELECT T1.emp_id,T1.status1 as status1,T1.timestamp1 as timestamp1,
T1.status2 as status2,T1.timestamp2 as timestamp2,
T2.status1 as status3,T2.timestamp1 as timestamp3,
T2.status2 as status4,T2.timestamp2 as timestamp4,
T3.status1 as status5,T3.timestamp1 as timestamp5,
T3.status2 as status6,T3.timestamp2 as timestamp6
FROM
(SELECT * FROM
(SELECT IF(((@row+1)=4) OR (@prevEmpId<>a1.emp_id),@row:=1,@row:[email protected]+1) as row,a1.emp_id,a1.status as status1,a1.timestamp as timestamp1,
'out' as status2,
@prevEmpId:=a1.emp_id,
(SELECT min(timestamp) as timestamp2
FROM overallrec a2
WHERE a2.timestamp > a1.timestamp
AND a2.emp_id = a1.emp_id
AND a2.status = 'out') as timestamp2
FROM overallrec a1,(SELECT @row:=0,@prevEmpId:=0)r
WHERE a1.status = 'in'
ORDER BY a1.emp_id,timestamp1
)T100
WHERE row=1
)T1
LEFT JOIN
(SELECT * FROM
(SELECT IF(((@row+1)=4) OR (@prevEmpId<>a1.emp_id),@row:=1,@row:[email protected]+1) as row,a1.emp_id,a1.status as status1,a1.timestamp as timestamp1,
'out' as status2,
@prevEmpId:=a1.emp_id,
(SELECT min(timestamp) as timestamp2
FROM overallrec a2
WHERE a2.timestamp > a1.timestamp
AND a2.emp_id = a1.emp_id
AND a2.status = 'out') as timestamp2
FROM overallrec a1,(SELECT @row:=0,@prevEmpId:=0)r
WHERE a1.status = 'in'
ORDER BY a1.emp_id,timestamp1
)T200
WHERE row=2
)T2
ON T1.emp_id = T2.emp_id AND DATE_FORMAT(T2.timestamp1,'%Y-%m-%d') = DATE_FORMAT(T1.timestamp1,'%Y-%m-%d')
LEFT JOIN
(SELECT * FROM
(SELECT IF(((@row+1)=4) OR (@prevEmpId<>a1.emp_id),@row:=1,@row:[email protected]+1) as row,a1.emp_id,a1.status as status1,a1.timestamp as timestamp1,
'out' as status2,
@prevEmpId:=a1.emp_id,
(SELECT min(timestamp) as timestamp2
FROM overallrec a2
WHERE a2.timestamp > a1.timestamp
AND a2.emp_id = a1.emp_id
AND a2.status = 'out') as timestamp2
FROM overallrec a1,(SELECT @row:=0,@prevEmpId:=0)r
WHERE a1.status = 'in'
ORDER BY a1.emp_id,timestamp1
)T300
WHERE row=3
)T3
ON T1.emp_id = T3.emp_id AND DATE_FORMAT(T3.timestamp1,'%Y-%m-%d') = DATE_FORMAT(T1.timestamp1,'%Y-%m-%d')
但是這個查詢不會,如果員工的時鐘在一天工作,然後第二天,因爲它正在使用同一天檢查,以便加入
請求一個視圖,但在mySQL視圖不允許變量,所以我試圖寫一個不同的查詢(不使用變量)如這個(sqlFiddle)
SELECT T4.emp_id,T4.status1,T4.timestamp1,T4.status2,T4.timestamp2,
T4.status3,T4.timestamp3,T4.status4,T4.timestamp4,T4.status5,T4.timestamp5,
'out' as status6,
(SELECT min(timestamp)
FROM overallrec a
WHERE a.timestamp > T4.timestamp5
AND a.emp_id = T4.emp_id
AND a.status = 'out') as timestamp6
FROM
(SELECT T3.emp_id,T3.status1,T3.timestamp1,T3.status2,T3.timestamp2,
T3.status3,T3.timestamp3,T3.status4,T3.timestamp4,
'in' as status5,
(SELECT min(timestamp)
FROM overallrec a
WHERE a.timestamp > T3.timestamp4
AND a.emp_id = T3.emp_id
AND a.status = 'in') as timestamp5
FROM
(SELECT T2.emp_id,T2.status1,T2.timestamp1,T2.status2,T2.timestamp2,
T2.status3,T2.timestamp3,
'out' as status4,
(SELECT min(timestamp)
FROM overallrec a
WHERE a.timestamp > T2.timestamp3
AND a.emp_id = T2.emp_id
AND a.status = 'out') as timestamp4
FROM
(SELECT T1.emp_id,T1.status1,T1.timestamp1,T1.status2,T1.timestamp2,
'in' as status3,
(SELECT min(timestamp)
FROM overallrec a
WHERE a.timestamp > T1.timestamp2
AND a.emp_id = T1.emp_id
AND a.status = 'in') as timestamp3
FROM
(SELECT a1.emp_id,a1.status as status1,a1.timestamp as timestamp1,
'out' as status2,
(SELECT min(timestamp) as timestamp2
FROM overallrec a2
WHERE a2.timestamp > a1.timestamp
AND a2.emp_id = a1.emp_id
AND a2.status = 'out') as timestamp2
FROM overallrec a1
WHERE a1.status = 'in'
AND NOT EXISTS (SELECT 1 FROM overallrec e
WHERE e.timestamp < a1.timestamp
AND e.emp_id = a1.emp_id
AND DATE_FORMAT(e.timestamp,'%Y-%m-%d') =
DATE_FORMAT(a1.timestamp,'%Y-%m-%d'))
)T1
)T2
)T3
)T4;
不幸的是,MySQL的觀點不允許子查詢(子查詢不能在使用從視圖中的條款)。 但什麼MySQL的允許是創造的意見,讓這裏俯視圖是(創造 意見sqlFiddle)
CREATE VIEW T100 AS
SELECT a1.emp_id,a1.status as status1,a1.timestamp as timestamp1,
'out' as status2,
(SELECT min(timestamp) as timestamp2
FROM overallrec a2
WHERE a2.timestamp > a1.timestamp
AND a2.emp_id = a1.emp_id
AND a2.status = 'out') as timestamp2
FROM overallrec a1
WHERE a1.status = 'in'
AND NOT EXISTS (SELECT 1 FROM overallrec e
WHERE e.timestamp < a1.timestamp
AND e.emp_id = a1.emp_id
AND DATE_FORMAT(e.timestamp,'%Y-%m-%d') =
DATE_FORMAT(a1.timestamp,'%Y-%m-%d'));
CREATE VIEW T200 AS
SELECT T1.emp_id,T1.status1,T1.timestamp1,T1.status2,T1.timestamp2,
'in' as status3,
(SELECT min(timestamp)
FROM overallrec a
WHERE a.timestamp > T1.timestamp2
AND a.emp_id = T1.emp_id
AND a.status = 'in') as timestamp3
FROM T100 AS T1;
CREATE VIEW T300 AS
SELECT T2.emp_id,T2.status1,T2.timestamp1,T2.status2,T2.timestamp2,
T2.status3,T2.timestamp3,
'out' as status4,
(SELECT min(timestamp)
FROM overallrec a
WHERE a.timestamp > T2.timestamp3
AND a.emp_id = T2.emp_id
AND a.status = 'out') as timestamp4
FROM T200 AS T2;
CREATE VIEW T400 AS
SELECT T3.emp_id,T3.status1,T3.timestamp1,T3.status2,T3.timestamp2,
T3.status3,T3.timestamp3,T3.status4,T3.timestamp4,
'in' as status5,
(SELECT min(timestamp)
FROM overallrec a
WHERE a.timestamp > T3.timestamp4
AND a.emp_id = T3.emp_id
AND a.status = 'in') as timestamp5
FROM T300 AS T3;
CREATE VIEW myFinalView AS
SELECT T4.emp_id,T4.status1,T4.timestamp1,T4.status2,T4.timestamp2,
T4.status3,T4.timestamp3,T4.status4,T4.timestamp4,T4.status5,T4.timestamp5,
'out' as status6,
(SELECT min(timestamp)
FROM overallrec a
WHERE a.timestamp > T4.timestamp5
AND a.emp_id = T4.emp_id
AND a.status = 'out') as timestamp6
FROM T400 AS T4;
所以我們有它一個看法:)稱爲myFinalView
這裏有一個myFinalView
與言論(檢查這sqlFiddle with remarks in the VIEW)
讓我嘗試這個..:) – user3114385
它不起作用,當我在ID 36的另一個日期再添加一次..請幫我.. – user3114385
讓我再試一次.. :) – user3114385