我需要获取最新记录,这些记录重复两次以上。
结构:
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
我的查询:
SELECT tag, COUNT(post_n) AS tags_count
FROM tags
GROUP BY tag HAVING tags_count>=2
ORDER BY post_n DESC LIMIT 5
但我得错了结果,最新一定是“xpro”,无法理解错误。
有什么想法吗?
P.S。 对不起我的英文。
答案 0 :(得分: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更快的SELECT慢速插入。统计数据在线更新
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;
答案 1 :(得分: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. 对不起,这是一个配方不好的问题,我的英语非常糟糕。