2016-02-10 1 views
0

Здравствуйте
Я хотел бы сделать событие для моего приложения
, который работает на вставке новых 3 записи для 1-пользователя каждого полуночного
поэтому количество строк должна бытьSQL вставить в выберите с параметром для использования с планировщиком событий


n x 3
п UserIds

+---------+-----------+-------+------------+------+----------+-------------+-------+ 
| userID | userNAME | chaID | chaNAME | goal | gender | row_number | dummy | 
+---------+-----------+-------+------------+------+----------+-------------+-------+ 
|  1 | Nanyang | 1 | blahblah | 1 |  2 |   1 |  1 | 
|  1 | Nanyang | 21 | something | 1 |  2 |   2 |  1 | 
|  1 | Nanyang | 2 | anything | 1 |  2 |   3 |  1 | 
|  2 | Julie  | 3 | x   | 2 |  1 |   1 |  2 | 
|  2 | Julie  | 12 | y   | 2 |  1 |   2 |  2 | 
|  2 | Julie  | 23 | z   | 2 |  1 |   3 |  2 | 
|  3 | Kingkong | 4 | a   | 1 |  2 |   1 |  3 | 
|  3 | Kingkong | 5 | b   | 1 |  2 |   2 |  3 | 
|  3 | Kingkong | 6 | c   | 1 |  2 |   3 |  3 | 
+---------+-----------+-------+------------+------+----------+-------------+-------+ 

row_number будут завернуты, пока они не < = 3

из моего письменного ..

set @num := 0, @type := ‘'; 
CREATE TABLE random 
as 
(
SELECT 
* 
FROM (
select userID,userNAME, chaID, chaNAME,goal,gender, 
     @num := if(@type = userID, @num +1,1) as row_number, 
     @type := userID as dummy 
    from userchar 
    order by userID 
) as x where x.row_number <= 3) 

Во всяком случае, я использовал, чтобы попытаться создать таблицу с Select the first/least/max row per group in SQL
и она работает очень хорошо, и получить результат, как я показано на рисунке. то мне нужно insert into в event вместо create table
так я получил этот код ниже .. потому что я не могу использовать SET @parameter для вставки

INSERT INTO random(userID, userNAME, chaID, chaNAME, goal, gender,row_number,dummy,status) 
    select * 
    from (select userID, userNAME, chaID, chaNAME, goal, gender, 
       (@num := if(@type = userID, @num +1,1) 
       ) as row_number, 
       userID as dummy, 
       @stat as status 
      from hb_usercha u cross join 
       (select @type = '', @num := 0, @stat := '') params 
      order by userID,rand() 
     ) 
    where row_number <= 3; 

и это результат того, что я получил

+---------+-----------+-------+------------+------+----------+-------------+-------+ 
    | userID | userNAME | chaID | chaNAME | goal | gender | row_number | dummy | 
    +---------+-----------+-------+------------+------+----------+-------------+-------+ 
    |  1 | Nanyang | 1 | blahblah | 1 |  2 |   1 |  1 | 
    |  1 | Nanyang | 21 | something | 1 |  2 |   1 |  1 | 
    |  1 | Nanyang | 2 | anything | 1 |  2 |   1 |  1 | 
    |  1 | Nanyang | 3 | s   | 2 |  1 |   1 |  1 | 
    |  1 | Nanyang | 12 | o   | 2 |  1 |   1 |  1 | 
    |  1 | Nanyang | 23 | m   | 2 |  1 |   1 |  1 | 
    |  1 | Nanyang | 4 | e   | 1 |  2 |   1 |  1 | 
    |  2 | Julie  | 5 | xoxo  | 1 |  2 |   1 |  2 | 
    |  2 | Julie  | 6 | xxx  | 1 |  2 |   1 |  2 | 
    +---------+-----------+-------+------------+------+----------+-------------+-------+ 

. 
. 
. 
. 

Кажется row_number петля не работает
И я понятия не имею, что происходит
Оба кода одинаковы, только что изменили параметры путь
Так было бы очень хорошо, если кто-то может объяснить мне
Спасибо большое

+0

Вы хотите, чтобы сделать это для всех пользователей существует в 'user_char' таблицы или для некоторых определенных пользователей? –

+0

sry для позднего ответа, но да, я собираюсь сделать это для всех пользователей в базе данных. –

+0

Отметьте ответ –

ответ

0

Предполагая, что вы хотите сделать это для всех пользователей существует в user_char таблице.

Использование Union all для получения 3 записей каждого пользователя и сохранения результата во временной таблице.

DELIMITER $$ 
CREATE EVENT `event_run_midnight` ON SCHEDULE EVERY 24 HOUR STARTS '2016-02-09 00:00:00' ON COMPLETION NOT PRESERVE ENABLE DO 
BEGIN 

    drop temporary table if exists temp_users_1; 
    create Temporary table temp_users_1 
    select users.*,@row_num:[email protected]_num+1 as row_num,userID as dummy 
    from(
      select * from user_char 
      union all 
      select * from user_char 
      union all 
      select * from user_char 
     ) as users,(select @row_num:=0) as row_number 
    order by UserID; 

    /* 
     Copy temp table data to other temp table as MySQL 
     not allows to use same temp table in single query. 
    */ 

    drop temporary table if exists temp_users_2; 
    create Temporary table temp_users_2 
    select * from temp_users_1; 

    -- final query which returns desired output : 
    INSERT INTO random(userID, userNAME, chaID, chaNAME, goal, gender,row_number,dummy) 
    Select usr.userID, 
      usr.userNAME, 
      usr.chaID, 
      usr.chaNAME, 
      usr.goal, 
      usr.gender, 
      usr.row_num-usr_grp.min_row_num+1 as row_number, 
      usr.userID as dummy 
    from temp_users_1 usr 
    inner join (
     Select userID, 
       min(row_num) as min_row_num 
     from temp_users_2 group by userID 
    ) usr_grp on usr.UserID=usr_grp.userID 
    where usr.row_num-usr_grp.min_row_num+1 <=3; -- Condition to show only 3 records of each users. 

END$$ 
DELIMITER ; 

Обновления:

1- Добавлено Создание событий.

2 Предполагая, что вы вставляете повторяющиеся записи пользователя в имя таблицы random.

3- Это мероприятие будет выполняться ежедневно в 12:00.

Примечание:

1- Вы, возможно, придется изменить имена таблиц, если имена таблиц различаются как в ответ.

2- Убедитесь, что вы включили планировщик событий MySQL в файле конфигурации, иначе событие не будет запускаться автоматически.

Вот ссылка, которая поможет вам позволяющий MySQL планировщик событий, если не включен: http://geeksterminal.com/enable-mysql-event-scheduler-status/1711/

+0

это то, что я получил T.T http://upic.me/show/57842425 –

+0

Я думал, что у вас есть пользовательский пользователь в таблице 'user_char'. Я обновляю ответ, чтобы получить 3 записи каждого пользователя. –

+0

Проверьте обновленный ответ. –