2010-10-07 100 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