【问题标题】:Get related table's related record in mysql获取mysql中的相关表相关记录
【发布时间】:2018-03-03 19:06:23
【问题描述】:

我有三个表 ClaimHeaderResClaimResActivityClaimHeader表的主键作为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 表中的 FileIDResClaim 表中的索赔总数和 ActivityNet 的总和strong> 来自具有匹配条件的 ResActivity 表。

我的预期结果是:

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 表中的计数。

【问题讨论】:

  • 这里的大多数人想要格式化文本,而不是图像(或图像链接)。
  • 添加一些示例表数据和预期结果。 (格式化文本...)并向我们展示您当前的查询尝试。
  • 第 1 步:JOIN 桌子!
  • 您的预期结果显示一个 fileid (fileid2)。所以你只想展示那个?那么为什么您的查询中没有WHERE 子句?还是您想选择更多行?每个文件ID一个可能吗?至于 ClaimDateSettlement:我也不明白。您说要显示它,但您的预期结果不包含它。那么你想展示什么?您预期的样本结果中的索赔数量?还是ClaimDateSettlement的数量不同?还是别的什么?
  • 附注:与您的姓名保持一致。如果该表名为 claimheaderclaim_header,那么您应该在此表和任何其他表中调用它的 ID claimheaderidclaim_header_id。对于名为fileid 的列,我希望您指的是另一个名为file 的表。但是,为什么在表claim_header 中有filename?那应该在file 表中。如果没有file表,那么在声明头表中应该没有fileid

标签: mysql sql


【解决方案1】:

仍然不完全清楚你在问什么。似乎您要么希望每个声明标题有一个结果行,要么每个文件有一个结果行。所以按相关列分组。

通过加入所有记录,您当然可以获得声明标题和声明多重,例如与

  • 声明标题:head1、head2
  • head1 的声明:claim10,claim11
  • head2 的声明:claim20,claim21
  • 权利要求 10 的操作:action100,action101
  • 权利要求 11 的操作:action110,action111
  • 权利要求 20 的操作:action200,action201

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

标题 |索赔 |行动 --------+----------+---------- 头1 |索赔10 |行动100 头1 |索赔10 |行动101 头1 |索赔11 |行动110 头1 |索赔11 |行动111 头2 |索赔20 |行动200 ...

现在,通过对每个标题进行分组,您可以获得一个用于 head1 的聚合结果行,一个用于 head2 的聚合结果行。由于中间结果包含每个操作的一条记录,因此您可以轻松地将它们相加。但至于声明:head1 有四条记录,如果您执行 count(*)count(claimpkid),您会得到 4 的结果(count(claimpkid) 计算所有不为空的 claimpkid,在这种情况下总是如此例子)。您想要做的是计算 distinct 声明(这里有两个:claim10 和 claim11)。所以使用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

【讨论】:

    猜你喜欢
    • 2012-05-23
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 2015-04-26
    • 2019-02-24
    • 2022-01-12
    相关资源
    最近更新 更多