2011-06-28 80 views
1

我想要合併來自3個表的數據,並且無法獲得確切的語法。使用連接從兩個以上的表中選擇數據

我有一組數據,如下所示,顯示誰做了記錄的歷史記錄。每個記錄的唯一標識符顯示在「ID」中,「Rec No」是分配給與記錄每次交互的序號。

 
ID Rec No Who  Type 
1 1  Bob  New 
1 2  Bob  Open 
1 3  Bob  Assign 
1 4  Sarah Add 
1 5  Bob  Add 
1 6  Bob  Close 
2 1  John New 
2 2  John Open 
2 3  John Assign 
2 4  Bob  Assign 
2 5  Sarah Add 
2 6  Sarah Close 
3 1  Sarah New 
3 2  Sarah Open 
3 3  Sarah Assign 
3 4  Sarah Close 

我需要找到所有'Assign'操作。但是,如果多個「分配」處於特定ID中,我想查找第一個。然後我也想找到那個人的名字。

我目前的代碼是─

mysql> SELECT IH.WHO, COUNT(IH.ID) 
    -> FROM INCIDENTS_H IH 
    -> JOIN( 
    -> SELECT ID, MIN(RECNO) AS RECNO 
    -> FROM INCIDENTS_H 
    -> WHERE TYPE = 'ASSIGN' 
    -> GROUP BY ID 
    ->)IH2 
    -> ON IH2.ID = IH.ID AND IH2.RECNO = IH.RECNO 
    -> GROUP BY IH.WHO 
    -> ; 

產生輸出

 
+------+--------------+ 
| WHO | COUNT(IH.ID) | 
+------+--------------+ 
| Bob |   1 | 
| John |   1 | 
+------+--------------+ 

到目前爲止好。不過,我還需要根據日期來限制輸出,該日期位於另一個名爲「事件」的表中。此表中的數據是在格式 -

 
+------+------------+ 
| ID | ADDEDDATE | 
+------+------------+ 
| 1 | 2011-06-01 | 
| 2 | 2011-06-03 | 
+------+------------+ 

ID列是兩個表中相同數量的,並因此可用於找出要使用哪個ADDEDDATE。那麼任何人都可以通過修改上面的代碼來協助代碼將輸出限制爲添加日期爲2011-06-03的記錄?

所以最好

 
+------+--------------+ 
| WHO | COUNT(IH.ID) | 
+------+--------------+ 
| John |   1 | 
+------+--------------+ 

我用mysql 5.1.40

回答

1

輸出將是─這是我嘗試的基礎上,我所理解的問題。
如果我沒有正確理解它,請留下評論,我會改進我所提的。

我覺得你幾乎沒有,那下面應該爲你工作:

SELECT IH.WHO,
        COUNT(IH.ID)
FROM    INCIDENTS_H IH
JOIN   (SELECT ID, MIN(RECNO) AS RECNO
         FROM INCIDENTS_H
         WHERE TYPE = 'ASSIGN'
         GROUP BY ID
        ) IH2
ON      IH2.ID = IH.ID
AND     IH2.RECNO = IH.RECNO
JOIN    INCIDENTS I
ON      I.ID = IH.ID
WHERE   I.ADDEDDATE = "2011-06-03"
GROUP BY IH.WHO

正如注:INCIDENTS_H主鍵(ID,RECNO)。
另外,值得注意的是,爲了使數據庫處於第四範式,需要有一個主鍵爲「Id」的表。這樣的桌子會讓你的生活更輕鬆。

+0

這偉大工程,非常感謝您的迅速反應。 – Andy

+0

很高興,@Andy –

2

剛剛加入到事件,並添加where子句:

SELECT IH.WHO, 
     COUNT(IH.ID) 
FROM INCIDENTS_H IH 
    INNER JOIN(
     SELECT ID, MIN(RECNO) AS RECNO 
     FROM INCIDENTS_H 
     WHERE TYPE = 'ASSIGN' 
     GROUP BY ID 
    )IH2 
     ON IH2.ID = IH.ID AND IH2.RECNO = IH.RECNO 
    INNER JOIN INCIDENTS I 
     ON IH.ID = I.ID 
WHERE I.ADDEDDATE = DATE('2011-06-03') 
GROUP BY IH.WHO 
+0

@ScorpiO非常棒的作品。剛剛必須將'IN IH.ID = I.ID'更改爲'ON IH.ID = I.ID' – Andy

+0

@安迪:是的,有一個錯字錯誤,它被糾正:) –

相關問題