代码之家  ›  专栏  ›  技术社区  ›  BioGeek

编写MySQL子查询的更好方法

  •  1
  • BioGeek  · 技术社区  · 12 年前

    我的MySQL数据库中有两个表: allele 和 locus 我想知道对于一个给定的基因座,有多少等位基因,其中有多少具有这种地位 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 回复  |  直到 12 年前
        1
  •  2
  •   M Khalid Junaid    12 年前

    您可以使用 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
    
        2
  •  2
  •   eggyal    12 年前

    一种方法是将轨迹按其状态分组,并获取每个状态的相应计数;使用 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' (可选 具有汇总功能 如果需要的话)-但它不会是可有可无的。