2010-10-07 99 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')。是吗?否则,你应该告诉我们你得到了什么结果以及它有什么问题。 – 2010-10-07 13:43:08

+0

对不起,已经改正 – swamprunner7 2010-10-07 13:52:56

回答

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

版本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 

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 2010-10-07 14:33:21

+0

补充解决方案,谢谢! – swamprunner7 2010-10-08 20:51:05