2010-10-07 4 views
0

Мне нужно получить последние записи, которые повторяются более двух раз.MySQL последние записи с условием

структура:

CREATE TABLE IF NOT EXISTS `tags` (
    `tag_n` int(10) NOT NULL AUTO_INCREMENT, 
    `post_n` int(10) NOT NULL, 
    `tag` varchar(30) COLLATE utf8_bin DEFAULT NULL, 
    PRIMARY KEY (`tag_n`), 
    KEY `tag` (`tag`), 
    KEY `post_n` (`post_n`), 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 

записей:

SELECT * FROM tags ORDER BY post_n DESC LIMIT 0 , 30 

alt text

Мой запрос:

SELECT tag, COUNT(post_n) AS tags_count 
FROM tags 
GROUP BY tag HAVING tags_count>=2 
ORDER BY post_n DESC LIMIT 5 

alt text

Но я получаю неправильные результаты, последний должен быть «xpro», не может понять, что не так.

Любые идеи?

p.s. извините за мой английский.

+0

Первое, что я замечаю, это то, что вы запрашиваете записи, повторяющиеся более двух раз, но ваш запрос ищет записи, повторяющиеся более одного раза ('> = 2', а не'> 2'). это оно? в противном случае вы должны, вероятно, показать нам, какой результат вы получаете, и что с ним не так. –

+0

Извините, уже исправлено – swamprunner7

ответ

0

Решение:

SELECT tag, COUNT(*)AS tags_count FROM 
(
    SELECT post_n, tag FROM tags 
    ORDER BY post_n DESC LIMIT 20 
) AS temp 
GROUP BY tag HAVING tags_count>=2 
ORDER BY post_n DESC LIMIT 5 

Конечно нужно изменить ограничение при первом выборе, иначе будет много, чтобы выбрать из.

P. S. Извините, что плохо сформулированный вопрос, мой английский очень плохой.

1

Version 1

SELECT tag, COUNT(post_n) AS tags_count ,max(post_n) as max_post_n 
FROM tags 
GROUP BY tag HAVING tags_count>=2 
ORDER BY max_post_n DESC LIMIT 5 

Version 2 Быстрее ВЫБРАТЬ медленнее вставить. Статистика обновления онлайн

CREATE TABLE IF NOT EXISTS `tags` (
    `tag_n` int(10) NOT NULL AUTO_INCREMENT, 
    `post_n` int(10) NOT NULL, 
    `tag` varchar(30) COLLATE utf8_bin DEFAULT NULL, 
    PRIMARY KEY (`tag_n`), 
    KEY `tag` (`tag`), 
    KEY `post_n` (`post_n`), 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 

CREATE TABLE IF NOT EXISTS `tags_stats` (
    `tag` varchar(30), 
    `tags_count` int(10) NOT NULL, 
    `max_post_n` int(10) NOT NULL, 
    PRIMARY KEY (`tag`) 

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 


Pseudo code : 

INSERT INTO tags(tag,post_n) VALUES(tag_value, post_n_value); 

row = SELECT * FROM tags_stats WHERE tag=tag_value; 
if not row: 
    INSERT INTO tags_stats(tag,tags_count,max_post_n) VALUES(tag_value,1,post_n_value); 
else: 
    if row.max_post_n < post_n_value 
     UPDATE tags_stats SET tags_count=tags_count+1, 
      max_post_n=post_n_value WHERE tag=tag_value; 
    else: 
     UPDATE tags_stats SET tags_count=tags_count+1, 
      WHERE tag=tag_value; 
####################################### 
SELECT * FROM tags_stats ORDER BY max_post_n DESC; 
+0

Похоже, что мне нужно. Не знал об этом методе заказа, спасибо! – swamprunner7

+0

добавлено решение, спасибо в любом случае! – swamprunner7

Смежные вопросы