2011-06-28 22 views
1

3つのテーブルのデータを結合しようとしていますが、正確な構文がわかりません。joinを使用して2つ以上のテーブルからデータを選択する

私は以下のようなデータセットを持っており、誰がレコードで何をしたのかの履歴を示しています。各レコードの一意の識別子は「ID」に示され、「レコード番号」はレコードとの各対話に割り当てられる連続番号です。

 
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にある場合は、最初のIDを探したいと思います。私はそれをした人の名前を見つけたいと思っています。

これまでのところは良い出力

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

を生成

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 
    -> ; 

は - 現時点で私が持っているコードに。しかし、私はまた、インシデントと呼ばれる別のテーブルに保持されている日付に基づいて出力を制限する必要があります。この表のデータは、ID列が両方の表で同じ数であるため、使用するADDEDDATE見つけるために使用することができるformat-

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

です。だから、誰もコードを上記のコードを変更して、2011年6月3日の日付を追加したレコードに出力を制限することができますか?私は、MySQL 5.1.40

答えて

1

を使用しています

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

は、理想的には出力がBE-でしょう。この私が質問を理解する方法に基づいて、私の試みは、あります。
正しく理解していない場合は、コメントを残してください。

私はあなたがほとんどそこにいると思うし、次はあなたのために働くべきである:

ただ、ノートなど

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の主キーは(同上、RECNO)です。
また、データベースが第4正規形になるためには、主キーが "Id"であるテーブルが必要であることに注意することは重要です。このようなテーブルはあなたの人生を楽にします。

+0

迅速な応答のための非常に素晴らしい、おかげで動作します。 – Andy

+0

A pley、@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

@Andy:はい、タイプミスがありました。修正済みです:) –

関連する問題