2013-12-19 57 views
1

我正在做一個簡單的時間和超時系統。我有3雙進/出。簡單的進/出記錄的複雜的選擇查詢

emp_id td_id status  timestamp   remarks 
    35  1  in 2013-12-19 10:15:09  late 
    35  2  out 2013-12-19 12:00:23  example 
    35  3  in 2013-12-19 13:00:23 
    35  4  out 2013-12-19 16:01:47 
    35  5  in 2013-12-19 18:01:17 
    35  6  out 2013-12-19 22:01:07 
    35  7  in 2013-12-20 10:00:12 

這裏是我的查詢:

SELECT a1.emp_id, a1.status, a1.timestamp, a2.status, a2.timestamp, a3.status, a3.timestamp, a4.status, a4.timestamp, a5.status, a5.timestamp, a6.status, a6.timestamp 
FROM overallrec a1 
LEFT JOIN overallrec a2 ON a2.emp_id = a1.emp_id 
AND a2.status = 'out' 
LEFT JOIN overallrec a3 ON a3.emp_id = a1.emp_id 
AND a3.status = 'in' 
AND a3.timestamp <> a1.timestamp 
LEFT JOIN overallrec a4 ON a4.emp_id = a1.emp_id 
AND a4.status = 'out' 
AND a4.timestamp <> a2.timestamp 
LEFT JOIN overallrec a5 ON a5.emp_id = a1.emp_id 
AND a5.status = 'in' 
AND a5.timestamp <> a3.timestamp 
LEFT JOIN overallrec a6 ON a6.emp_id = a1.emp_id 
AND a6.status = 'in' 
AND a6.timestamp <> a4.timestamp 
WHERE a1.status = 'in' 

這裏是我的結果:

emp_id status  timestamp  status  timestamp  status  timestamp  status  timestamp  status  timestamp  status  timestamp 
    35  in 2013-12-19 10:15:09 out 2013-12-19 12:00:23 in 2013-12-19 13:00:23 out 2013-12-19 16:01:47 in 2013-12-19 18:01:17 out 2013-12-19 22:01:07 
    35  in 2013-12-20 10:00:12 out 2013-12-19 12:00:23 in 2013-12-19 13:00:23 out 2013-12-19 16:01:47 in 2013-12-19 18:01:17 out 2013-12-19 22:01:07 

的通知「中的」時間戳值2行中的第一個是另一個日期,但未來地位時間戳很快正在重複從以前的日期。我希望它仍然爲空時顯示空值,而不是複製上一日期的值。換句話說,它應該在日更改中生成另一行。

附加說明:當我在每個輸入處添加備註時,它將被連接在表結果中。我想它是這樣的:

emp_id status  timestamp  status  timestamp  status  timestamp  status  timestamp  status  timestamp  status  timestamp  remarks 
    35  in 2013-12-19 10:15:09 out 2013-12-19 12:00:23 in 2013-12-19 13:00:23 out 2013-12-19 16:01:47 in 2013-12-19 18:01:17 out 2013-12-19 22:01:07 "Late, Example" 
    35  in 2013-12-20 10:00:12 null   null   null   null   null   null   null   null   null   null "Straight time" 

我應該怎麼做我的查詢?或者如果沒有查詢,還有什麼?

回答

1

更改答案,我忘了通過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

+0

讓我嘗試這個..:) – user3114385

+0

它不起作用,當我在ID 36的另一個日期再添加一次..請幫我.. – user3114385

+0

讓我再試一次.. :) – user3114385

1

你可以嘗試添加group by到查詢:

group by a1.emp_id, date(a1.timestamp), date(a2.timestamp), date(a3.timestamp), 
     date(a4.timestamp), date(a5.timestamp), date(a6.timestamp) 

說實話,雖然,我會做整個查詢與「中」和一排「走出去」條件的聚集。這將適用於一對,但不是三個。我不明白你爲什麼要在一行上放三對。那麼一天只有兩對的員工呢?或者誰有四雙?

+0

即時通訊工作與3對最大每一天。他們想要3雙..我認爲他們把它分爲上午,下午和晚上班。你有什麼想法如何在兩對工作? – user3114385

+0

我剛剛試過你的答案先生。現在的問題是當第二個IN是空的時候它複製第一個IN的值...請heeeelp .. :( – user3114385

+0

@ user3114385 ...正如我所提到的,你的查詢有更多的問題,而不僅僅是日期問題 –