Получение N-го подзапроса для INSERT - PullRequest
1 голос
/ 28 января 2011

Аннотация

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

Таблица

<b>posts:</b>
   post_id(PK:INT) | user_id(INT) | ... | timestamp(TIMESTAMP)

<b>hiscore:</b>
   user_id(INT) | rank(INT)

Запрос

TRUNCATE TABLE `hiscore` ;
INSERT INTO `hiscore` (`user_id`,`rank`)
 (
   SELECT `user_id`, ???
   FROM `posts`
   WHERE `timestamp` BETWEEN blah AND blah
   GROUP BY `user_id`
   ORDER BY COUNT(`post_id`) DESC
   LIMIT 20
 )

Актуальный вопрос

Что нужно вставить в приведенный выше запрос вместо ??? для учета ранга?

Есть ли переменная типа @NTH_SUBQUERY, которая заменит 5 при пятом запуске подзапроса SELECT?


ОБНОВЛЕНИЕ: Стол hiscore должен только содержать 20 верхних постеров. Я знаю, что структура таблицы может быть оптимизирована. Основное внимание в ответах должно быть уделено тому, как определить текущую найденную строку подзапроса.

Ответы [ 2 ]

2 голосов
/ 28 января 2011
INSERT INTO `hiscore` (`user_id`,`rank`)
 (
   SELECT `user_id`, @rank = @rank + 1
   FROM `posts`, (SELECT @rank := 0) r
   WHERE `timestamp` BETWEEN blah AND blah
   GROUP BY `user_id`
   ORDER BY COUNT(`post_id`) DESC
   LIMIT 20
 )
1 голос
/ 28 января 2011

Вы, кажется, слишком увлечены truncate, для вас случаи

hiscore:
   the_date (DATE) | user_id(INT) | rank(INT)

и встроенный ключ на the_date, rank

вставка

set @pos=0;

insert into hiscore
select cur_date(), user_id, @pos:=@pos+1
from ...

Чтобы сохранить размер таблицы, вы, вероятно, можете удалять один раз в несколько месяцев

Или вы можете установить auto_increment на rank

create table hiscore
(
  the_date date not null,
  rank int(3) not null auto_increment,
  user_id int(10) not null,
  primary key (the_date, rank)
);

Итак, ранг автоматически увеличивается (что соответствует порядку убывания количества ежедневных постов)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...