簡體   English   中英

在mysql中獲取相關表的相關記錄

[英]Get related table's related record in mysql

我有三個表ClaimHeaderResClaimResActivity 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

表格截圖

ResClaim表使用HeaderPKIDClaimHeader表的外鍵和ResActivity表使用ClaimPKIDResClaim表的外鍵

我的情況是我應該顯示所有三個表的相關記錄。

例如我想從表ClaimHeader顯示寫到FileID,總要求從ActivityNetResClaim表與和從計數表ResActivity與匹配condtion。

我的預期結果將是:

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表中的計數。

現在還不清楚您要問什么。 看來您要么想要每個索賠標頭一個結果行,要么每個文件想要一個結果行。 因此,按相關列分組。

通過加入所有記錄,您當然可以得到索賠標頭和索賠索賠,例如

  • 聲明標題:head1,head2
  • head1的索賠:claim10,claim11
  • head2的索賠:Claim20,Claim21
  • 索賠10的動作:action100,action101
  • 要求11采取的措施:action110,action111
  • 索賠20的動作:action200,action201

您可以從聯接中得到以下中間結果:

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

現在,通過對每個標頭進行分組,您將為head1獲得一個匯總結果行,為head2獲得一個匯總結果行。 由於中間結果每個動作包含一個記錄,因此您可以輕松地將它們相加。 但是關於聲明: count(claimpkid)有四個記錄,如果執行count(*)count(claimpkid) ,則結果為4( count(claimpkid)計算所有不為null的claimpkid ,在這種情況下總是如此這個例子)。 相反,您要計算的是不同的索償(此處分別為兩個: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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM