优化mysql查询以选择值

优化mysql查询以选择值,mysql,sql,group-by,Mysql,Sql,Group By,我有一个具有以下列名的表:audit_name、audit_choice和slno作为自动递增主键,不用于输出数据 可以重复audit_名称,并且audit_选项值仅限于某些值,如Passed、Failed 我的查询预期输出是,获取每个审核名称的通过计数和失败计数数 这是我尝试过的查询,但执行大约1000条记录需要3-4分钟 SELECT audit_name, (SELECT COUNT(*) AS Passed FROM audit AS p1 WHERE p1.audit_n

我有一个具有以下列名的表:audit_name、audit_choice和slno作为自动递增主键,不用于输出数据

可以重复audit_名称,并且audit_选项值仅限于某些值,如Passed、Failed

我的查询预期输出是,获取每个审核名称的通过计数和失败计数数

这是我尝试过的查询,但执行大约1000条记录需要3-4分钟

SELECT audit_name,
  (SELECT COUNT(*) AS Passed FROM audit AS p1
     WHERE p1.audit_name=p2.audit_name AND p1.audit_choice="Passed") AS Passed,
  (SELECT COUNT(*) AS Failed FROM audit AS p3
     WHERE p3.audit_name=p2.audit_name AND p2.audit_choice="Failed") AS Failed
  FROM audit AS p2
  GROUP BY audit_name

请建议我如何优化查询。

我还建议将字符串值(如Passed和Failed)移出表,改为使用整数标识符-它们的比较速度比字符串快得多。

我还建议将字符串值(如Passed和Failed)移出表,改为使用整数标识符-它们是比较起来比字符串快得多。

为了澄清,像audit\u choice='Passed'这样的表达式返回一个布尔值,它的值为0表示False,1表示True。为了澄清,像audit\u choice='Passed'这样的表达式返回一个布尔值,它的值为0表示False,1表示True,上的1,0失败应为,0,1。。。事实上,两个都有相同的计数结果。你看到了,上的1,0失败应为,0,1。。。实际上,两者的计数结果相同
SELECT  audit_name,
        SUM(audit_choice = 'Passed') AS passed,
        SUM(audit_choice = 'Failed') AS failed
FROM    audit
GROUP BY
        audit_name
    SELECT  audit_name,
         SUM(if(audit_choice = 'Passed',1,0)) AS passed,
         SUM(if(audit_choice = 'Failed',1,0)) AS failed
    FROM    audit
    GROUP BY
    audit_name