繁体   English   中英

编写MySQL子查询的更好方法

[英]Better way to write MySQL sub-query

我的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

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

您可以使用带有条件的sum的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

一种方法是按位置状态分组,并获取每个状态的相应计数。 使用WITH ROLLUP 修饰符将在末尾添加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 ),但是它不是可精简的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM