3

現在空のテーブルに 100 ほどの偽のレコードを入力して、過去 2 年間のログインをシミュレートし、コードをテストする必要があります。

ログイン テーブルのスキーマは次のようになります。

CREATE TABLE `Logins` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `User_ID` int(11) NOT NULL,
  `Date_Login` datetime NOT NULL,
  `Location` enum('site','admin') NOT NULL,
  PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

私は一般的にSQLに本当に慣れていないので、過去のクエリがどのように見えるべきか少しもわかりません

INSERT INTO `Logins` (`User_ID`,`Date_Login`,`Location`) VALUES ...

私が必要とするのは、N 個のエントリ (100 としましょう) を挿入するLoginsことです。

  • User_IDUsersテーブルのIDフィールドから値を取得します
  • Date_Login2 年前から現在までの間である必要があります
  • Locationと を交互に使用する必要が'site'あります'admin'が、'site'より重み付けされています (時間の 80% など)。

うまくいけば、将来的に同様の問題を解決するために SQL-fu を収集できます :D

ありがとう!

(MySQL 5.1 を使用しています)

4

2 に答える 2

2

Logins テーブルに 1 つの行を挿入する SQL ステートメントを次に示します。これを (ストアド プロシージャなどで) 繰り返し実行して、複数のレコードを取得できます。複数のレコードを取得するには、複数回実行する必要があります。これまでに増やすと、10 個のレコードが取得されますが、LIMIT 1値は各レコードで同じになるためです。LIMIT 10User_ID

INSERT INTO `Logins` (`User_ID`, `Date_Login`, `Location`)
SELECT
  users.ID AS `User_ID`,
  DATE_SUB(NOW(), INTERVAL FLOOR(1 + (RAND() * (365 * 2))) DAY) AS `Date_Login`,
  IF(RAND() > 0.8, 'admin', 'site') AS `Location`
FROM users
ORDER BY RAND()
LIMIT 1;

通常ORDER BY RAND()は効率が悪いため悪いスタイルですが、これはパフォーマンスに敏感なタスクではありません。

于 2010-06-29T21:00:22.623 に答える
0

完全な SQL ソリューションを使用する場合、ループを作成する方法は次のとおりです。http://dev.mysql.com/doc/refman/5.1/en/iterate-statement.html ランダムな日付を取得するには、 +、*、およびいくつかのタイムスタンプと組み合わせて RAND() を使用します。

于 2010-06-29T20:55:32.617 に答える