在mysql中获取相关表的相关记录

问题描述 投票:0回答:1

我有三个表ClaimHeader,ResClaim和ResActivity。 ClaimHeader表的主键在ResClaim表中用作外键,ResClaim表的主键在ResActivity表中用作外键。

以下是我的表格

ClaimHeader:

HeaderID  FileID    FileName
1         fileid1    file1.xml
2         fileid2    file2.xml
3         fileid3    file3.xml
4         fileid4    file4.xml
--------------------------------------------------
ResClaim:

ClaimPKID  HeaderPKID    ClaimDateSettlement
1          1             2017-04-08
2          1             2017-03-08
3          2             2017-04-10
4          3             2017-05-08
--------------------------------------------------
ResActivity:

ActivityPKID  ClaimPKID    ActivityNet
1             1             400
2             2             3000
3             2             2030
4             3             5000

Tables screenshot

ResClaim表使用HeaderPKID作为来自ClaimHeader表的外键,ResActivity表使用ClaimPKID作为ResClaim表中的外键

我的场景是我应该显示所有三个表中的相关记录。

例如,我想显示来自ClaimHeader表的FileID,来自ResClaim表的Total索赔计数和ResActivity表中具有匹配条件的ActivityNet的Sum。

我的预期结果是:

FileID   |  Total Claim(s) |  ActivityNet 
--------------------------------------------------
fileid2  |    1            |   5030 (3000+2030)
--------------------------------------------------

我试过下面的查询:

SELECT 
  `ClaimHeader`.*, 
  count(ResClaim.ClaimPKID) as claims,  
  sum(ResActivity.ActivityNet) as net 
FROM 
  `ClaimHeader` 
  RIGHT OUTER JOIN `ResClaim` 
    ON ResClaim.ClaimPKID = ClaimHeader.HeaderID 
  RIGHT OUTER JOIN `ResActivity` 
    ON ResClaim.ClaimPKID = ResActivity.ActivityPKID

上面的查询没有返回相关的记录值 - 而是返回所有列的总和并从ResActivity和ResClaim表中计数。

mysql sql
1个回答
0
投票

你问的问题仍然不完全清楚。您似乎要么每个声明标题需要一个结果行,要么每个文件需要一个结果行。因此,按相关列分组。

通过加入所有记录,您获得的索赔标题和索赔当然是多方面的,例如:同

  • 声明标题:head1,head2
  • 对头1的索赔:权利要求10,权利要求11
  • 对头部2的索赔:权利要求20,权利要求21
  • 权利要求10的动作:动作100,动作101
  • 权利要求11的动作:动作110,动作111
  • 权利要求20的动作:动作200,动作201

你从连接得到这个中间结果:

header | claim   | action
-------+---------+----------
head1  | claim10 | action100
head1  | claim10 | action101
head1  | claim11 | action110
head1  | claim11 | action111
head2  | claim20 | action200
...

现在,通过按标题分组,您将获得head1的一个聚合结果行,head2的一个聚合结果行。由于中间结果包含每个操作一个记录,因此您可以轻松地对它们求和。但至于声称:head1有四个记录,如果你做count(*)count(claimpkid)你会得到4的结果(count(claimpkid)计算所有非空的claimpkid,在这个例子中总是如此)。你想要做的是计算不同的主张(在这里是两个:权利要求10和权利要求11)。所以使用COUNT DISTINCT

select 
  h.headerid, 
  count(distinct c.claimpkid) as claims,  
  coalesce(sum(a.activitynet), 0) as net 
from claimheader h
left outer join resclaim c on c.claimpkid = h.headerid 
left outer join resactivity a on a.activitypkid = c.claimpkid
group by h.headerid
order by h.headerid;

我使用左外连接(和COALESCE)的情况是标题没有声明或声明没有动作,为此我们将显示零而不是从结果中删除它们。

如上所述,如果你想要每个文件,那么选择fileid并按它而不是headerid分组。

© www.soinside.com 2019 - 2024. All rights reserved.