0

私はちょっとしたレポート作成に取り組んでおり、一時テーブルを使用する必要があると考えています。私のコードは、その日にそのシステムとやり取りするすべてのユーザー Cookie を取得するために API 呼び出しを実行します。

これで、すべての Cookie とそれらが使用するブラウザーのタイプを含むテーブルができました。API によって提供された Cookie の配列をループして、それぞれの sql ルックアップを実行し、diff ブラウザーのカウンターをインクリメントすることができます。さまざまなブラウザーによって行われたブラウザー アクセスの数を報告できます。

ただし、ご想像のとおり、Cookie が大量にある場合 (ある場合)、これには非常に時間がかかる可能性があります。

私が知っていることから、解決策は、渡されたCookieの一時テーブルを作成し、それをCookieデータテーブルに内部結合してから、

select count(id),broswer ... group by browser

以下は、私が試してやりたいことのより多くのコードビューです:

$json = file_get_content($apiURL);
$cookies = '';
foreach($json as $val){$cookies .= ','.$val['cookie']; }
$cookies = substr($cookies,1);

mysql_query('CREATE TEMPORARY TABLE passedcookies (
  `cookie` varchar(200) NOT NULL,
  PRIMARY KEY(cookie)
) values ($cookies);')

mysql_query('SELECT count(cd.id), cd.browser FROM cookiedata cd
            INNER JOIN passedcookies pc
            ON pc.cookie = cd.cookie
            GROUP BY cd.browser;');

mysql_query('DESTROY TEMP TBL;');

一時テーブルを破棄する必要がありますか? いつ破壊されますか?3 人のユーザーがレポートを実行すると、それぞれが独自の一時テーブルを取得しますか?

助けてくれてありがとう

4

1 に答える 1

2

必要に応じて、一時テーブルを破棄できます。そうしないと、MySQL 接続が閉じられたときに自動的に破棄されます。共有接続を使用していない限り、これは PHP スクリプトが終了したときに発生します。

共有接続を使用していない場合、各ユーザーは独自の一時テーブルを取得します。

PS一時テーブルを作成するためのSQL構文が間違っていますが、それについて質問しませんでした。の後に使用するステートメントに属するVALUES節はありません。CREATE TEMPORARY TABLEINSERT

実際、あなたがしていることについては、一時テーブルは必要ないと思います。クエリ:

SELECT browser, count(*)
FROM cookiedata
WHERE cookie in ($cookies)
GROUP BY browser

正常に動作するはずです。IN (list)MySQL はかなりうまく実装されていると思います。

于 2013-08-28T19:50:01.983 に答える