编写MySQL子查询的更好方法

时间:2014-03-05 15:19:12

标签: mysql

我的MySQL数据库中有两个表:allelelocus。我想知道一个给定的基因座有多少等位基因以及有多少具有状态Tentative的等位基因。我目前有子查询的以下查询:

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

但我觉得必须有更好的方法来编写此查询。

2 个答案:

答案 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

答案 1 :(得分:2)

一种方法是根据状态对基因座进行分组,并获取每个状态的相应计数;使用WITH ROLLUP modifier会在结尾处添加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) - 但它不会被篡改。