2015-08-04 2 views
0

Я в настоящее время использую MySQL в качестве базы данных. Я хочу получить TOP 3 большинство ТЕМАТИКОВ с САМОЙ ПОЧТОЙ COUNT для всех 12 months. Итак, мой результат, как правило, дает мне 36 rows. (ТОП 3 Яна, ТОП февраля ... и др.)Запрос, чтобы получить TOP 3 строки за 12 месяцев

сообщение таблица

CREATE TABLE IF NOT EXISTS `Post` (
    `post_id` VARCHAR(16) NOT NULL, 
    `staff_id` INT NOT NULL, 
    `topic_id` INT NOT NULL, 
    `status_id` INT NOT NULL, 
    `post_title` VARCHAR(100) NOT NULL, 
    `post_date_time` DATETIME NOT NULL, 
    `description` VARCHAR(1000) NOT NULL, 
    `latest_update` DATETIME NULL, 
    `approval` INT NULL, 
    `approval_date` DATE NULL, 
    PRIMARY KEY (`post_id`), 
    INDEX `fk_Post_Staff(User)1_idx` (`staff_id` ASC), 
    INDEX `fk_Post_Topic1_idx` (`topic_id` ASC), 
    INDEX `fk_Post_Status1_idx` (`status_id` ASC), 
    CONSTRAINT `fk_Post_Staff(User)1` 
    FOREIGN KEY (`staff_id`) 
    REFERENCES `staff` (`staff_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_Post_Topic1` 
    FOREIGN KEY (`topic_id`) 
    REFERENCES `Topic` (`topic_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_Post_Status1` 
    FOREIGN KEY (`status_id`) 
    REFERENCES `Status` (`status_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

ответ

0
select floor(period/100) `year`, period%100 `month`, topic_id 
    from 
    (select @n := if(@m=period, @n:[email protected]+1, @n:=1) n, @m:=period period, topic_id 
     from 
      (select year(post_date_time)*100+month(post_date_time) period, 
        topic_id, count(post_id) count 
      from post 
      group by period, topic_id 
      order by period, count desc) t1, 
      (select @n:=1) tn, 
      (select @m:=0) tm) t2 
    where n<4 

Demo for simplified data

Вы можете установить период данных по сочинительства, как хвост, например

having `year` = 2015 and `month` between 1 and 6 
Смежные вопросы