1

次の列名を持つテーブルがあります: audit_name、audit_choice、および "slno" を自動インクリメント主キーとして使用し、出力データには使用しません。

audit_name は繰り返すことができ、audit_choice の値は「合格」、「失敗」などの特定の値に限定されます。

私のクエリの予想される出力は、「Audit_name」ごとに「合格」カウントと「失敗」カウントの数を取得することです。

これは私が試したクエリですが、約 1,000 レコードを実行するには約 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

クエリを最適化する方法を教えてください。

4

3 に答える 3

4
SELECT  audit_name,
        SUM(audit_choice = 'Passed') AS passed,
        SUM(audit_choice = 'Failed') AS failed
FROM    audit
GROUP BY
        audit_name
于 2012-06-05T11:43:28.547 に答える
2

また、「Passed」や「Failed」などの文字列値をテーブルから移動し、代わりに整数識別子を使用することをお勧めします。これらは文字列よりもはるかに高速に比較されます。

于 2012-06-05T11:44:02.090 に答える
1
    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
于 2012-06-05T11:48:57.720 に答える