私は今日、テストケースの統計に関する3つのクエリを含むデータベースを持っています。私はphpを使用してWebサイトを構築していますが、クエリの実行に時間がかかりすぎるため、実行したくないので完全なサイト統計を表示できません。現在、データベースがバッチで更新されることはめったにないので、この目的のためにデータベースを毎日/毎週更新するイベントを作成できます。
今日、必要な情報を表示するために、次の3つのクエリがあります。
SELECT key FROM testcase GROUP BY key;
これにより、4〜10グループのテストからのintのリストが得られます。引数の場合は1、2、3、4と言います。次に、サブクエリでこれをキーとして繰り返し、次の2つのクエリで合格したテストの数と合格しなかったテストの数を取得します。
SELECT COUNT(*) AS passed FROM testcase INNER JOIN testcases ON
testcase.ID = testcases.testcaseid WHERE pass = 1 AND key = %value%;
と
SELECT COUNT(*) AS failed FROM testcase INNER JOIN testcases ON
testcase.ID = testcases.testcaseid WHERE pass = 0 AND key = %value%;
これが今日の仕組みです。クエリはキーごとに約25〜30秒かかり、サイトがタイムアウトになります。(%value%は、forループからの現在の値の擬似コードです)
代わりに、統計としてサイトに表示するために毎日/毎週入力するキー、合格、不合格のテーブルで構成されるデータベーステーブルにこれを追加するSQLクエリを考えていました。サブクエリで反復できる場合がいくつかありますが、実行された2つのクエリが反対であるため、これに対する解決策はわかりません。
クエリで使用する値にインデックスを付けようとしましたが、成功しませんでした(これも間違っている可能性があります)。
//アンドレアス(SQL初心者)
編集:
ああ、解決策を設定するジレンマ、私はゴードンとジョーからコンバインを作成して、魅力のように機能する最速のクエリを作成しました。
INSERT INTO statistics (key,passed,failed)
SELECT
key,
SUM(case when T.pass = 1 then T.matches else 0 end) as passed,
SUM(case when T.pass = 0 then T.matches else 0 end) as failed
FROM
(SELECT
key,pass,COUNT(*) AS matches
FROM testcase INNER JOIN testcases ON
testcase.ID = testcases.testcaseid
GROUP BY key,pass)T
GROUP BY key