使用join从两个以上的表中选择数据

时间:2011-06-28 13:10:52

标签: sql join

我正在尝试合并来自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  

我需要找到所有'分配'操作。但是,如果多个“分配”在某个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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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) 此外,值得注意的是,为了使数据库处于第4范式,需要有一个主键为“Id”的表。这样的桌子会让你的生活更轻松。