0

同様のデータを含む2つのデータベーステーブルがあります。1つはプロセスによって完了した作業の量であり、もう1つはそのプロセスによって行われたエラーの量です。

正しい初回作業の割合を表示したいと思います。

プロセスごとにアイテムの数を数えるための私のクエリは次のとおりです。

SELECT Counter.Process, count( Counter.Process ) AS count
                            FROM Counter WHERE (TIME BETWEEN '2012-07-01 00:00:00' AND '2012-07-06 23:59:59')
                            GROUP BY Counter.Process
                            ORDER BY count DESC

上記は私に次のようなリストを与えます:

Process    | count
-------------------
Process A  | 40
Process B  | 32
Process C  | 102
Process D  | 23

「エラー」と呼ばれる、エラーを記録するための同じフィールドを持つ2番目のテーブルがあります。

同じクエリを使用することで(ただし、明らかにテーブル名を変更することで)、プロセスとエラーのリストを取得できます。

私がやりたいのは、プロセスごとのエラーの割合を示すPHPWebページを作成することです。

私の問題は、2つのクエリを別々に作成する場合、PHP Whereループを使用してそれらをループすると、パーセンテージを表示するための計算方法がわかりません。

2つのSQLクエリ間でUNIONを使用しようとしましたが、プロセスに対する2つの異なるカウント読み取り値を表示することができません。

理想的には、次のようなデータを表示する方法が必要です。

Process   | Counter.count | Errors.count
Process A     40              2
Process B     32              0
Process C     102             18
Process D     23              8

これをどのように達成できるかについてのアドバイス/提案を本当にいただければ幸いです。データベーステーブルに関する詳細情報が必要な場合は、お知らせください。

読んでくれてありがとう

S

4

4 に答える 4

0

私は個人的にこのような状況をPHPで実行することを好みます。混乱が少ないので、PHPでどのように実行するかを説明します(データベース構造やシステム仕様について何も知らない可能性があるため、「考える」と言います)。そうでなければ私を作ってください):

$rows = array();
$res = mysql_query('SELECT Counter.Process, count( Counter.Process ) AS count
                        FROM Counter WHERE (TIME BETWEEN '2012-07-01 00:00:00' AND '2012-07-06 23:59:59')
                        GROUP BY Counter.Process
                        ORDER BY count DESC');
while ($arr = mysql_fetch_assoc($res))
{
    $rows[] = $arr;
}

$res2 = mysql_query('SELECT Errors.Process, count( Errors.Process ) AS count
                        FROM Counter WHERE (TIME BETWEEN '2012-07-01 00:00:00' AND '2012-07-06 23:59:59')
                        GROUP BY Errors.Process
                        ORDER BY count DESC');
while ($arr2 = mysql_fetch_assoc($res2)
{
    for ($i=0; $i<count($rows); $i++)
    {
        if ($arr2["Process"] == $data[$i]["process"])
        {
            break;
        }
        //Do your functions with $arr and $data[$i] at this point...
    }
}
于 2012-07-06T19:53:54.230 に答える
0

私はそれを実行しなかったので、間違いがあるかもしれません。2つの選択を行い、結果を左結合することができます。

select s.process, s.success_count, e.error_count
from 
(SELECT Counter.Process as process, count( Counter.Process ) AS success_count
 FROM Counter
 WHERE (TIME BETWEEN '2012-07-01 00:00:00' AND '2012-07-06 23:59:59')
 GROUP BY Counter.Process
) s left join
(SELECT Errors.Process, count( Errors.Process ) AS error_count
      FROM Errors
      WHERE (TIME BETWEEN '2012-07-01 00:00:00' AND '2012-07-06 23:59:59')
      GROUP BY Errors.Process 
) e
on (s.Process = e.process)
于 2012-07-06T19:37:32.943 に答える
0

サブクエリなしでそれを行うのは簡単なはずです:

SELECT 
    Counter.Process
    , COUNT(Counter.Process) AS ProcessCount
    , COUNT(Errors.Process) AS ProcessErrors
FROM
    Counter
    LEFT JOIN
    Errors
    ON Counter.Process = Errors.Process
WHERE
    Counter.TIME BETWEEN '2012-07-01 00:00:00' AND '2012-07-06 23:59:59'
GROUP BY
    Counter.Process

両方のクエリについて説明を行い、どちらがデータに最適かを確認できます。

-編集:プロセスにエラーがない場合に行を見逃さないように、LEFTJOINに変更しました。

于 2012-07-06T19:56:23.027 に答える
-1

サブクエリを使用できます。

SELECT Counter.Process, count( Counter.Process ) AS Count,
      (SELECT count(Errors.Process) 
         FROM Errors
        WHERE Process=Counter.Process 
          AND (TIME BETWEEN '2012-07-01 00:00:00' AND '2012-07-06 23:59:59')) AS Errors
                            FROM Counter WHERE (TIME BETWEEN '2012-07-01 00:00:00' AND '2012-07-06 23:59:59')
                            GROUP BY Counter.Process
                            ORDER BY count DESC

よろしく、ニール。

于 2012-07-06T19:31:53.053 に答える