2011-09-11 70 views
0

我想每天保存遊戲前100名的結果。最佳查詢 - 以任何方式避免循環中的數百個查詢?

我有兩個表:用戶,統計。

用戶分貝有兩列:的userID(MEDIUMINT(8)無符號AUTO_INCREMENT)和的userName(VARCHAR(500))。

統計分貝有三列:時間(日期),用戶ID (MEDIUMINT(8)無符號AUTO_INCREMENT),結果(TINYINT(3)無符號)。

現在,我每次執行查詢(每天)我有100個結果機智用戶名數組。因此,這裏就是我需要做的:

對於每個結果數組:從用戶表

  1. 獲取用戶ID - 或者,如果用戶沒有在用戶存在 表不是創建條目,並獲得ID;
  2. 插入到統計表當前日期,用戶標識和結果。

什麼是在php和mysql中執行此操作的最佳方式。有沒有辦法避免'for'循環中有200個查詢。

感謝您的時間夥計。

+0

200日查詢真的沒有那麼多...... – Amber

+0

什麼進入統計「結果」列?緩存了 – CAFxX

回答

0

使用一對prepared statements。你仍然每次運行100次,但查詢本身已經被解析(甚至被數據庫服務器緩存),它只會有100個不同的參數集來運行,這非常有效。

+0

?插? –

+0

解析後的查詢被緩存。結果不是。 – Amber

1
  1. 200日查詢日不算什麼。你可以保留一切,不會有任何問題。

  2. 爲什麼你有一個用戶名的數組,你應該有用戶ID?

  3. Mysql INSERT查詢支持多個VALUES語句。所以,你可以像組裝

    VALUES(時間,用戶ID,結果),(時間,用戶ID,結果),(時間,用戶ID,結果)

一個字符串,並一次運行它。

另請注意,userID應該是int,而不是int,在stats表中不應該自動增加。

+0

感謝您的幫助,不幸的是我必須處理用戶名,而不是userID。 – Mark

+0

沒問題。只需重寫你的代碼。從那時起,永遠不會使用用戶名來標識用戶,而只是用戶標識。只是因爲用戶可以重命名... –

+0

那麼,我沒有acces到該代碼:)我只獲得100位用戶名列表。否則它會更容易。再次感謝您的幫助。 – Mark