2010-06-29 22 views
3

我需要用一百個左右的假記錄來填充當前空表,以模擬過去兩年來登錄以測試我的代碼。用於生成示例數據的快速SQL查詢

登錄表模式是這樣的:

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_ID吸引了來自Users表的ID
  • Date_Login其值應在2年前,現在
  • Location應該'site''admin'之間交替之間,但'site'更大的權重(比方說80%的時間)。

希望我能蒐集一些SQL-FU,以幫助今後發生類似的問題:d

謝謝!

(我使用的MySQL 5.1)

回答

2

這是一條SQL語句,用於將單行插入到登錄表中。您可以反覆運行(例如在存儲過程中)以獲取多條記錄。您必須多次運行它才能獲取多條記錄,因爲如果將LIMIT 1增加到LIMIT 10,您將獲得10條記錄,但User_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()是壞的風格,因爲它是低效率的,但是這不是一個性能敏感的任務。