说明:表里有3个字段,id是一篇文章的id号,words是这篇文章出现的关键的词(一篇文章有3个),date这篇文章发布日期
表结构:
id words date
1 词1 20120407
1 词2 20120407
1 词3 20120407
2 词1 20120407
2 词4 20120407
2 词5 20120407
3 词1 20120407
3 词2 20120407查询要求:统计某个时间段(date)内 words出现频率最高的前多少个id问题所在:就现在的表不知道怎么统计的sql怎么写(大概知道用group by之类的...),2或者直接帮在下重新设计表结构都行
表结构:
id words date
1 词1 20120407
1 词2 20120407
1 词3 20120407
2 词1 20120407
2 词4 20120407
2 词5 20120407
3 词1 20120407
3 词2 20120407查询要求:统计某个时间段(date)内 words出现频率最高的前多少个id问题所在:就现在的表不知道怎么统计的sql怎么写(大概知道用group by之类的...),2或者直接帮在下重新设计表结构都行
select words,count(*)
from 表结构
where date between 某个时间段 and 某个时间段
group by words
) t
order by 2 desc limit 20
1 词1 20120407
1 词2 20120407
1 词3 20120407
2 词1 20120407
2 词4 20120407
2 词5 20120407
3 词1 20120407
3 词2 20120407你这样会有很多冗余,一篇文章有很多关键字是不是会很多记录,为什么每一个关键字需要作为一个记录呢?可以varchar(xx)然后“词1,词2.”,也可以用set字段存储。
建了一个表
mysql> create table book (id int primary key auto_increment,words varchar(20)
,date timestamp default CURRENT_TIMESTAMP );
mysql> insert into book values("语文,语文,语文"),("语文,语文,语文") ,("数学,语文,化学");mysql> insert into book(words) values("数学,语文,因为") ;
Query OK, 1 row affected (0.26 sec)mysql> insert into book(words) values("数学,语文,历史") ;
Query OK, 1 row affected (0.27 sec)mysql> select * from book;
+----+------------------+---------------------+
| id | words | date |
+----+------------------+---------------------+
| 1 | 语文,语文,语文 | 2012-04-07 21:54:33 |
| 2 | 数学,语文,化学 | 2012-04-07 21:54:59 |
| 3 | 数学,语文,因为 | 2012-04-07 21:55:14 |
| 4 | 数学,语文,历史 | 2012-04-07 21:55:25 |
+----+------------------+---------------------+这样能解决冗余,但是这个sql 有点不好写如果不考虑冗余就很好写这sql
1楼就能解决。