我正在尝试合并来自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
答案 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”的表。这样的桌子会让你的生活更轻松。