3

table1、table2、....table12のような12個のmysqldbテーブルがあります。各テーブルには200,000レコードがあります。各レコードには、国、ユーザータイプ、パッケージ列が含まれます。上記の3列の統計を取得したい。それを行うには、まず、配列を作成しています。次に、配列を使用して、統計データを取得しています。

for ($i=1; $i<=12; $i++)
{
   $query="SELECT `country`, `usertype`, `package` FROM `table$i`";
   $result=mysql_query($query);
   while ($row = mysql_fetch_assoc($result))
   {
      $country= $row['country'];
      $usertype= $row['usertype'];
      $package= $row['package'];

      $stat_array[$country][$usertype][$package]= 1 + $stat_array[$country][$usertype][$package]
   }
}

結果が出るまでにはかなりの時間がかかります。これは統計を取得するための最良の方法ですか?良い方法を教えてください。また、これはより多くのRAMメモリを使用しますか。少ないメモリ使用量で取得する方法が必要です

前もって感謝します

4

3 に答える 3

3

12クエリ?UNIONにコマンドがあることに注意してSQLください。これを試してみてください:

for ($i=1; $i<=12; $i++)
   $query=($i>1?'UNION ALL ':'')."SELECT `country`, `usertype`, `package` FROM `table$i` ";
$result=mysql_query($query);
// other code below
于 2012-11-28T08:35:47.397 に答える
1

ここでの問題の1つは、すべて同じ関数にphpが変数によって割り当てられたメモリを削除しないためです。したがって、新しい行を上書き/作成します...。

whileループの最後で、行、国、ユーザータイプ、およびパッケージの設定を解除する必要があります。これはメモリの面で役立つはずです(少なくともPHP 5.3までは、大量のデータ行を反復処理するときに同様の問題が発生していました)。もう1つの問題は、データベース内の3つのフィールドの組み合わせごとに1つの配列フィールドを作成するstat_arr変数です。最悪の場合、200kのエントリがあります。これは、それ自体で多くのRAMを使用します。

さらに、私が見るところから、あなたはそれらの3つの列だけを数えたいと思うでしょう。これは別の方法で行うことができます。

使用(ID /プライマリフィールドをどのように呼び出したかわからないため、次のコードではIDと呼んでいます):

$Query = "SELECT count(id) AS c_u_p_statistics,`country`, `usertype`, `package` FROM `table$i` GROUP BY `country`, `usertype`, `package`";

そうすれば、手動で合計する必要はありませんが、SQLを介して合計することができます(ほとんどの場合、より効率的です)。

于 2012-11-28T08:33:03.220 に答える
1

そのすべてがクエリに含まれています。以下のクエリは、国ごとのカウント、ユーザータイプ、およびパッケージを含む結果を提供します。明らかに、ループを使用して12個のテーブルユニオンを作成できますが、読みやすくするために、合計で書き留めました。

また、UNIONだけでなくUNIONALLを使用することにも注意してください。UNIONを使用すると、重複する行は破棄されますが、テーブル1のカウントが特定のグループに対して100であり、テーブル2にも同じグループに対して100がある場合、100を2回返すため、合計は200になります。 UNIONを使用すると、100が1回返され、合計も明らかに100になります。

SELECT SUM(cnt) as total, `country`, `usertype`, `package` FROM
(
    SELECT COUNT(country) as cnt, `country`, `usertype`, `package` FROM table1 GROUP BY `country`, `usertype`, `package`
    UNION ALL
    SELECT COUNT(country) as cnt, `country`, `usertype`, `package` FROM table2 GROUP BY `country`, `usertype`, `package`
    UNION ALL
    SELECT COUNT(country) as cnt, `country`, `usertype`, `package` FROM table3 GROUP BY `country`, `usertype`, `package`
    UNION ALL
    SELECT COUNT(country) as cnt, `country`, `usertype`, `package` FROM table4 GROUP BY `country`, `usertype`, `package`
    UNION ALL
    SELECT COUNT(country) as cnt, `country`, `usertype`, `package` FROM table5 GROUP BY `country`, `usertype`, `package`
    UNION ALL
    SELECT COUNT(country) as cnt, `country`, `usertype`, `package` FROM table6 GROUP BY `country`, `usertype`, `package`
    UNION ALL
    SELECT COUNT(country) as cnt, `country`, `usertype`, `package` FROM table7 GROUP BY `country`, `usertype`, `package`
    UNION ALL
    SELECT COUNT(country) as cnt, `country`, `usertype`, `package` FROM table8 GROUP BY `country`, `usertype`, `package`
    UNION ALL
    SELECT COUNT(country) as cnt, `country`, `usertype`, `package` FROM table9 GROUP BY `country`, `usertype`, `package`
    UNION ALL
    SELECT COUNT(country) as cnt, `country`, `usertype`, `package` FROM table10 GROUP BY `country`, `usertype`, `package`
    UNION ALL
    SELECT COUNT(country) as cnt, `country`, `usertype`, `package` FROM table11 GROUP BY `country`, `usertype`, `package`
    UNION ALL
    SELECT COUNT(country) as cnt, `country`, `usertype`, `package` FROM table12 GROUP BY `country`, `usertype`, `package`

) temp
GROUP BY `country`, `usertype`, `package`

補足:あなたはする必要はありません

$stat_array[$country][$usertype][$package]= 1 + $stat_array[$country][$usertype][$package];

あなたはただすることができます:

$stat_array[$country][$usertype][$package]++;

そして最後に、あなたが持っているような多次元配列を使用する場合、内部的には多くのチェックを行う必要があります。簡単に言えば、最初に配列内の適切な国を見つけて、別の配列を作成します。その配列でユーザータイプを見つけてから、パッケージの3番目の配列で同じことを繰り返します。

$ country、$ usertype、および$ packageがすべて文字列である場合は、文字列を結合してそれを使用することができます。

$key = $country.'_'.$usertype.'_'.$package;
$stat_array[$key]++;

しかし、それはすべて、データを配列に格納した後のデータの処理方法に依存すると思います。合計数を出力するだけの場合は、配列は必要ありませんが、クエリ結果ループに直接出力します。

于 2012-11-28T08:50:06.463 に答える