2014-03-05 36 views
1

我有兩個表在我的MySQL數據庫:allelelocus。我想知道給定軌跡有多少個等位基因以及那些有多少個等位基因Tentative。我目前有以下查詢子查詢:更好的方法來寫MySQL子查詢

SELECT COUNT(*) as alleleCount, 
    (SELECT COUNT(*) 
     FROM allele 
     INNER JOIN locus ON allele.LocusID = locus.PrimKey 
     WHERE Status = 'Tentative' 
     AND locus.ID = 762 
    ) as newAlleleCount 
FROM allele 
INNER JOIN locus ON allele.LocusID = locus.PrimKey 
WHERE locus.ID = 762 

但我覺得必須有更好的方式來寫這個查詢。

+1

考慮提供合適的DDLs(和/或sqlfiddle)與期望的結果集合在一起。 – Strawberry

+0

哪個表是「狀態」? –

回答

2

您可以通過它的狀態使用SUM()使用帶有條件總和將導致一個布爾值1或0,這樣就會給你算你的條件

SELECT locus.ID,COUNT(*) `all_alleles_per_locus`, 
    SUM(Status = 'Tentative') `tentative_alleles_762` 
    FROM allele 
    INNER JOIN locus ON allele.LocusID = locus.PrimKey 
    GROUP BY locus.ID 
+0

@eggyal顯示等位基因的數量,無論該特定位點的狀態如何 –

+0

@eggyal抱歉,如果沒有正確理解您的觀點可以說,如果有3個等位基因用於位點762,那麼第二列總和(locus.id = 762)將會結果爲3糾正我,如果我說錯了,我上面的查詢是爲locus兩個特定列是爲762軌跡來顯示計數 –

+0

@eggyal現在我得到你的觀點'locus.ID = 762'總和是沒有用的更新我的帖子感謝一個好點[這是更簡單](http://sqlfiddle.com/#!2/fe871/2) –

2

一種方法是組軌跡,並獲取每個狀態的相應計數;使用WITH ROLLUPmodifier將在年底加NULL狀態佔總:

SELECT status, COUNT(*) 
FROM  allele JOIN locus ON locus.PrimKey = allele.LocusID 
WHERE locus.ID = 762 
GROUP BY status WITH ROLLUP 

如果你絕對不希望將所有狀態的列表,你可以改爲GROUP BY status = 'Tentative'(可選WITH ROLLUP如果需要的話)—但不會是可控的。

相關問題