2011-09-11 7 views
0

ゲームのトップ100の結果を毎日保存します。最適なクエリ - ループ内で何百ものクエリを回避する方法はありますか?

私は2つのテーブルを持っています:ユーザ、統計。 ユーザーID(MEDIUMINT(8)符号なしAUTO_INCREMENT)とuserNameに(VARCHAR(500)):

ユーザーDBは、2つの列を有しています。 時間(日付)、ユーザーID(MEDIUMINT(8)符号なしAUTO_INCREMENT)、結果(TINYINT(3)符号なし):

統計DBは、3つの列を有しています。

今、クエリ(毎日)を実行するたびに、私は100の結果ウィットのユーザー名の配列を持っています。 ;またはユーザーがユーザーにエントリを作成してIDを取得するよりも、 テーブルを存在しない場合 - Usersテーブルから

  1. のgetユーザーID:

    をアレイ内のすべての結果について:だから、ここで私は何をする必要があるかです

  2. 現在の日付、ユーザーID、および結果を統計表に挿入します。

phpとmysqlでこれを行う最適な方法は何でしょうか。 'for'ループで200個のクエリを避ける方法はありますか?

お世話になりました。

+0

1日に200件のクエリが実際にはそれほどではありません... – Amber

+0

統計情報の「結果」列にはどのようなものがありますか?キャッシュされた – CAFxX

答えて

0

prepared statementsのペアを使用してください。あなたはまだそれぞれ100回実行しますが、クエリ自体は既に解析されており(DBサーバーによってキャッシュされています)、実行するパラメータは100種類あります。これは非常に効率的です。

+0

?インサート? –

+0

解析されたクエリがキャッシュされます。結果はそうではありません。 – Amber

1
  1. 200クエリパーデーは何もありません。あなたはすべてをそのまま残すことができ、1つの問題はありません。

  2. 代わりにユーザーIDを使用する必要があるユーザー名を持つ配列はありますか。

  3. Mysql INSERTクエリでは複数のVALUES文がサポートされています。だから、あなたは

    VALUES(時間、ユーザーID、結果)、(時間、ユーザーID、結果)、(時間、ユーザーID、結果)

のような文字列を組み立てる可能性があり、一度にそれを実行します。

また、userIDはmediumでなくintでなければならず、またstatsテーブルでは自動インクリメントしないでください。

+0

あなたの助けていただきありがとうございます。残念ながら、私はuserIDsではなくユーザー名を扱わなければなりません。 – Mark

+0

問題ありません。コードを書き直すだけです。それ以来、ユーザーを識別するためのユーザー名は使用せず、ユーザーIDのみを使用します。ちょうどユーザーが名前を変更することができるので... –

+0

私はそのコードへのアクセス権を持っていません:)私は100人のユーザー名のリストを取得します。さもなければそれはより容易になるでしょう。もう一度あなたの助けをありがとう。 – Mark

関連する問題