【问题标题】:Selecting data from more than 2 tables using join使用连接从超过 2 个表中选择数据
【发布时间】:2011-06-28 13:10:51
【问题描述】:

我正在尝试合并 3 个表中的数据,但无法获得准确的语法。

我有一组数据如下,显示谁对记录做了什么的历史。每条记录的唯一标识符显示在“ID”中,“Rec No”是分配给与记录的每次交互的序号。

ID Rec No Who Type 1 1 鲍勃 新 1 2 鲍勃公开赛 1 3 鲍勃分配 1 4 莎拉 添加 1 5 鲍勃加 1 6 鲍勃·克洛斯 2 1 约翰·纽 2 2 约翰公开赛 2 3 约翰分配 2 4 鲍勃分配 2 5 莎拉 添加 2 6 莎拉关闭 3 1 莎拉 新 3 2 莎拉公开赛 3 3 萨拉分配 3 4 莎拉关闭

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

产生输出

+--------+--------------+ |世界卫生组织 |计数(IH.ID) | +--------+--------------+ |鲍勃 | 1 | |约翰 | 1 | +--------+--------------+

到目前为止一切顺利。但是,我还需要根据日期限制输出,该日期保存在另一个名为 Incidents 的表中。此表中的数据格式为-

+--------+------------+ |身份证 |添加日期 | +--------+------------+ | 1 | 2011-06-01 | | 2 | 2011-06-03 | +--------+------------+

ID 列在两个表中的编号相同,因此可用于找出要使用的 ADDEDDATE。那么任何人都可以通过修改上面的代码来协助代码将输出限制为添加日期为 2011-06-03 的记录吗?

所以理想的输出应该是-

+--------+--------------+ |世界卫生组织 |计数(IH.ID) | +--------+--------------+ |约翰 | 1 | +--------+--------------+

我正在使用 mysql 5.1.40

【问题讨论】:

    标签: sql join


    【解决方案1】:

    只需加入事件并添加 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
    

    【讨论】:

    • @ScorpiO 太棒了,效果很好。只需将“IN IH.ID = I.ID”更改为“ON IH.ID = I.ID”
    【解决方案2】:

    这是我的尝试,基于我对问题的理解。
    如果我没有正确理解它,请发表评论,我会改进我所说的。

    我想你快到了,以下应该对你有用:

    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”的表。这样的桌子会让你的生活更轻松。

    【讨论】:

      猜你喜欢
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 1970-01-01
      • 2017-12-05
      • 1970-01-01
      相关资源
      最近更新 更多