1

私は今日、テストケースの統計に関する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
4

2 に答える 2

1

試す:

select key, pass, count(*) from testcase group by key, pass

上のインデックスpassは役に立たないでしょう。のインデックスkey、それは少し役立つはずです。しかし、カーディナリティが4〜10の場合、まあ、あまり役に立ちません。

于 2013-03-04T19:18:24.253 に答える
1

これはすべて、必要なキーと情報を返す1つのクエリで実行する必要があると思います。

select key,
         SUM(case when pass = 1 AND key = %value% then 1 else 0 end) as passed,
         SUM(case when pass = 0 AND key = %value% then 1 else 0 end) as failed
from testcase INNER JOIN testcases ON 
      testcase.ID = testcases.testcaseid 
group by key

可能な限り、データベースに「反復」を実行させ、結果のデータを読み戻す必要があります。

あなたのコメントに応えて。$ VALUEにキーのリストがある場合は、次のように実行できます。

insert into statistics(key, pass, fail)
    select key,
           SUM(case when pass = 1 then 1 else 0 end) as passed,
           SUM(case when pass = 0 then 1 else 0 end) as failed
    from testcase INNER JOIN testcases ON 
         testcase.ID = testcases.testcaseid 
    where concat(',', $VALUE, ',') like concat('%', key, '%')
    group by key

または、クエリを生成する場合は、リストをin句に入れることができます。したがって、次のwhereようになります。

where key in (2, 3, 4, 5)
于 2013-03-04T19:21:54.713 に答える