0

MySQL DB からデータを取得する PHP アプリケーションがあります。PHP が DB にクエリを実行すると、結果が取得され、すべての出力行が画面に出力されますが、上部にはグラフも出力され、出力行が視覚化されます。次のように (これは 24 の縦線の棒グラフです。これは、MySQL が PHP に代わって実行されたクエリから 24 行の出力を生成したためです)。

24 行の MySQL 出力

ユーザーが多くの結果を生成するクエリを実行すると、私が直面する問題が発生します。下の 2 番目の図は、PHP アプリケーションでさまざまな選択可能なパラメーターを使用して PHP に代わってクエリを実行したときに MySQL が生成した 150 の結果を視覚的に表したものです。垂直線の最大数が必要です(たとえば、50としましょう)。クエリが 50 行を超える場合、MySQL の結果を視覚化のために 50 行に統合します。ユーザーが必要に応じて任意の結果を見ることができるように、グラフの下にすべての行を出力します。私の質問は、コードを理解して従うのが難しくなく、CPU サイクルに関してこれを行う最適な方法は何ですか?

150 行の MySQL 出力

私が持っていた 1 つのアイデアは、PHP アプリケーションでこれに取り組むことです。ここでは、MySQL 出力の行数を 50 で割るだけです (ここでも、簡単な数字を想定してみましょう。丸めは、このインスタンスで作業する簡単な問題です)。MySQL が 500 行を生成する場合、500 を 50 で割ると 10 になるので、10 行ごとに棒グラフに垂直線を引きます。

もう 1 つのアイデアは、MySQL でこの問題に取り組むことです。おそらくMySQLクエリを実行し、結果を変数にコピーしてから、10行ごとに選択するクエリに対して2番目のクエリを実行するか、MySQL内で統合する方法がある場合は、2番目の小さなデータセットを提示しますPHPに。

この問題に取り組むのに最適な場所はどこで、その理由と方法は?

更新

もう少し説明するように要求されたように、それは本当に非常に基本的なシナリオです:

結果は次のようになります。各行は整数値とタイム スタンプです (棒グラフは期間 [X 軸] に対する値 [Y 軸] を示します)。

row | value | timestamp 
 1  | 10    | 1234-01-01 10:30
 2  | 10    | 1234-01-01 10:35
 3  | 15    | 1234-01-01 10:40
 4  | 15    | 1234-01-01 10:45
 5  | 10    | 1234-01-01 10:50

MySQL が 150 行の出力を生成すると、上の 2 番目のグラフのような結果が得られます。クエリが 300 の結果または例を生成する場合、棒グラフの線は非常に細いためにほとんど見えないため、統合機能を作成しようとしています。これは、不要なレベルの視覚的な粒度になります。

4

1 に答える 1

0

私はこの問題を、SQL に任せるのではなく、PHP アプリケーションで自分自身で簡単に解決しました。

アプリケーションには、すべての MySQL 結果行を含む配列があります。PHP は各配列エントリをループし、Javascript をエコーし​​て棒グラフに垂直バーとして表示します。

そのループの前にこのコードを挿入すると、問題は簡単かつ十分に解決されました。

$maxbars = 50;
if(count($array_mysql_resutls)>$maxbars) {
    $devision = count($array_mysql_resutls)/$maxbars;
    $resultsarray = Array();
    for($i = 0; $i < $maxbars; $i++) {
        $resultsarray[$i] = $array_mysql_resutls[ceil($devision*$i)];
    }
    $graph_traces = $resultsarray;
}

ceil()最も重要なことは、結果セット全体に均等に分散するために、分割された数字 ( ) を切り上げていることです。

于 2013-07-24T10:15:16.297 に答える