Быстрый запрос SQL для генерации данных примера - PullRequest
3 голосов
/ 30 июня 2010

Мне нужно заполнить в настоящее время пустую таблицу сотней или около того фальшивых записей, чтобы имитировать логины за последние два года для тестирования моего кода.

Схема таблицы входа выглядит следующим образом:

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 извлекает свои значения из поля ID таблицы Users
  • Date_Login должно быть 2 года назад и сейчас
  • Location должен чередоваться между 'site' и 'admin', но с 'site' более тяжелым весом (скажем, 80% времени).

Надеюсь, я смогу найти немного SQL-фу, чтобы помочь с подобными проблемами в будущем: D

Спасибо!

(я использую MySQL 5.1)

Ответы [ 2 ]

2 голосов
/ 30 июня 2010

Вот инструкция 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() - это плохой стиль, потому что он неэффективен, но это не чувствительная к производительности задача.

0 голосов
/ 30 июня 2010

Если вы хотите использовать полное решение SQL, вот как вы можете создать цикл: http://dev.mysql.com/doc/refman/5.1/en/iterate-statement.html Чтобы получить случайную дату, вы можете использовать RAND () в сочетании с +, * и некоторыми временными метками.

...