说明:表里有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或者直接帮在下重新设计表结构都行

解决方案 »

  1.   

    select * from (
    select words,count(*)
    from 表结构
    where date between 某个时间段 and 某个时间段
    group by words
    ) t
    order by 2 desc limit 20
      

  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你这样会有很多冗余,一篇文章有很多关键字是不是会很多记录,为什么每一个关键字需要作为一个记录呢?可以varchar(xx)然后“词1,词2.”,也可以用set字段存储。
      

  3.   

    做了实验
    建了一个表
    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楼就能解决。
      

  4.   

    创建基于 date 的索引。