[英]Get related table's related record in mysql
我有三個表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
ResClaim表使用HeaderPKID從ClaimHeader表的外鍵和ResActivity表使用ClaimPKID從ResClaim表的外鍵
我的情況是我應該顯示所有三個表的相關記錄。
例如我想從表ClaimHeader顯示寫到FileID,總要求從ActivityNet的ResClaim表與和從計數表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表中的計數。
現在還不清楚您要問什么。 看來您要么想要每個索賠標頭一個結果行,要么每個文件想要一個結果行。 因此,按相關列分組。
通過加入所有記錄,您當然可以得到索賠標頭和索賠索賠,例如
您可以從聯接中得到以下中間結果:
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.