使用连接从超过 2 个表中选择数据

Posted

技术标签:

【中文标题】使用连接从超过 2 个表中选择数据【英文标题】:Selecting data from more than 2 tables using join 【发布时间】: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

【问题讨论】:

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

【讨论】:

以上是关于使用连接从超过 2 个表中选择数据的主要内容,如果未能解决你的问题,请参考以下文章

mysql插入tbl(从2个表中选择)

当从 id 从 30000 开始计时超过 2 分钟的大表中更新和选择时

在 MySQL 中从其中一个表中选择 MAX(differ_key) 来连接特定键上的 2 个表 [重复]

MySQL INSERT ... 从 1 个表中选择 2 个表

如何从 SQL Server 中包含多行数据的 2 个表中选择 4 个不同的值?

从 2 个或更多表中获取数据:选择还是加入?