2013-06-11 20 views
0

比方說,我有一張帶有ID,時間戳和事件的表。MySQL:不同ID的子摘要時間戳

例如:我HABE一個隨書ID 1,另一個與ID 2兩者都是由事件在特定的時間戳出借,標註在表1

然後兩者都與事件2。所以返回我怎樣才能找出每本書的借閱期限?我無法找到答案,我變得瘋了!

ID | Timestamp | Event 
------------------------------- 
a1 | 2013-10-23 | 1 
a2 | 2013-10-23 | 1 
a1 | 2013-10-25 | 2 
a2 | 2013-10-26 | 2 

結果

ID | Days lent | 
----------------------- 
a1 |  2  | 
a2 |  3  | 

我沒有更好的解釋,對不起。每個子查詢我嘗試了「多於一行」的錯誤結果。

我試圖在subquerys TIMESTAMPDIFF,我試圖減去兩個querys。當然有許多不同的ID,但結構與發佈的完全相同

+0

什麼是'timestamp'列的數據類型?它是「日期」嗎? –

+0

它直接是一個時間戳。我也試圖將其轉換。但它失敗了第二我試圖計算每個ID的差異 – user2476011

回答

0

你可以使用這樣的查詢:

SELECT 
    id, 
    DATEDIFF(
    MAX(CASE WHEN Event=2 THEN Timestamp END), 
    MIN(CASE WHEN Event=1 THEN Timestamp END)) AS days_lent 
FROM 
    schedule 
GROUP BY 
    id 
+0

對於初學者來說,這對我手邊的日期起作用。謝謝!!! – user2476011

1

在您的設計中,您沒有足夠的數據來執行計算。例如。如果再次發佈a1,則只需插入另一個事件3,這會導致混淆,例如事件1,2和3中的哪一個是問題事件,哪些是返回事件。

爲了解決這個問題,我提出以下建議。

對發出/返回事件對使用相同的事件ID。 添加新指標以顯示它是哪種記錄,發佈或返回。

E.g.

ID | Timestamp | Event | Type 
--------------------------------------- 
a1 | 2013-10-23 | 1 | Issue 
a2 | 2013-10-23 | 1 | Issue 
a1 | 2013-10-25 | 1 | Return 
a1 | 2013-10-26 | 1 | Return 

因此,在這種情況下,查詢將

Select Book.ID, (Return_T.return_date - Issue_T.issue_date) duration 
from 
(Select ID, Timestamp issue_date from Book where Type='Issue') Issue_T, 
(Select ID, Timestamp return_date from Book where Type='Return') Return_T, 
Book 
where Book.ID = Issue_T.ID 
and Issue_T.ID = Return_T.ID 
+0

我最大的問題是,我不決定我的表結構如何,我們得到一個csv在學校的一些解釋,並且必須找到一種方法來解決這個。我能夠回答9/10問題,但是這個問題讓我瘋狂 – user2476011

+0

在這種情況下,@ ypercube的解決方案應該爲你工作。我的答案是面向現實世界的情景。 –

+0

是的,+1,這個答案中的所有好筆記。 –

1
SELECT 
    s.id, 
    DATEDIFF(e.timestamp, s.timestamp) AS Days_lent 
FROM 
    schedule AS s   -- start 
    JOIN 
    schedule AS e   -- end 
     ON s.id = e.id 
     AND s.timestamp < e.timestamp 
WHERE 
    s.event = 1 
    AND 
    e.event = 2 ; 

測試:SQL-Fiddle