有一个需求,现在有一个新闻的数据表(news),里面的字段是新闻id(id),栏目id(cid),新闻标题(title)和发布时间(pubdate)。要合起来读其中3个栏目的新闻,现在用的语句是select * from news where cid=1 or cid=2 or cid=3;不过这3个栏目的新闻会出现一个情况,有些新闻是重复的新闻重复是指在一个时间间隔内(2天之内)标题相同的才是重复的比如说,栏目1在2011-10-1发了一条标题叫“学院放假通知”的新闻,栏目2在2011-9-30号也发了一条“学院放假通知”的新闻,这两条新闻重复但是在2011-9-31到2011-10-2之外的日期发的“学院放假通知”则不算和上面的重复,比如在2010年发的“学院放假通知”或者2011-9-10发的,就不算这样子我有没有办法使用sql语句直接读出这3个栏目的新闻,并且把上面说的这种重复的新闻去掉?

解决方案 »

  1.   

    贴建表及插入记录的SQL,及要求结果出来看看
      

  2.   

    表很大的,我写个例子把id   cid  title               pubdate
    1    1    学院放假通知        2011-10-2
    2    2    学院放假通知        2011-10-1 
    3    3    学院放假通知        2011-9-30
    4    1    测试新闻1           2011-9-30
    5    4    测试新闻2           2011-8-5
    6    3    测试新闻3           2011-7-29
    7    2    测试新闻4           2011-6-1
    8    2    学院放假通知        2011-3-22
    比如数据是上面的数据要的是
    id   cid  title               pubdate
    1    1    学院放假通知        2011-10-2
    4    1    测试新闻1           2011-9-30
    6    3    测试新闻3           2011-7-29
    7    2    测试新闻4           2011-6-1
    8    2    学院放假通知        2011-3-22前面3条时间在2天之内,标题一样,算是重复的,要只输出一条,后面第8条虽然标题一样,但是隔的时间不在2天之内,不算重复,照样输出这样子
      

  3.   

    select distinct title ,* from news where cid=1 or cid=2 or cid=3;
      

  4.   

     (不要高估你的汉语表达能力或者我的汉语理解能力)
       建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
       参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html
       
       1. 你的 create table xxx .. 语句
       2. 你的 insert into xxx ... 语句
       3. 结果是什么样,(并给以简单的算法描述)
       4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
       
       这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。   
      

  5.   

    不好意思,有事请假回家了没有网络,上不来,没有3楼说的那么简单,3楼的只是把title这一栏的重复的去掉了而已我想要的是有日期条件的。可能真的是我表达能力问题。数据库是mysql的,5版本CREATE TABLE IF NOT EXISTS `test` (
      `id` int(4) NOT NULL AUTO_INCREMENT,
      `cid` int(4) DEFAULT NULL,
      `title` varchar(500) CHARACTER SET utf8 DEFAULT NULL,
      `pubdate` date DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=17 ;INSERT INTO `test` (`id`, `cid`, `title`, `pubdate`) VALUES
    (1, 1, '测试通知新闻', '2011-12-05'),
    (2, 2, '测试通知新闻', '2011-12-05'),
    (3, 3, '测试通知新闻', '2011-12-04'),
    (4, 1, '测试新闻1', '2011-12-04'),
    (5, 2, '测试新闻2', '2011-12-04'),
    (6, 3, '测试新闻3', '2011-12-03'),
    (7, 4, '测试新闻4', '2011-12-02'),
    (8, 2, '测试新闻5', '2011-12-02'),
    (9, 1, '测试新闻6', '2011-12-02'),
    (10, 2, '测试新闻7', '2011-12-01'),
    (11, 3, '测试通知新闻', '2011-12-01'),
    (12, 2, '测试通知新闻', '2011-11-30'),
    (13, 3, '测试新闻9', '2011-11-30'),
    (14, 1, '测试新闻10', '2011-11-30'),
    (15, 4, '测试新闻12', '2011-11-28'),
    (16, 2, '测试通知新闻', '2011-11-27');要的结果
    1 1 测试通知新闻 2011-12-05 
    4 1 测试新闻1 2011-12-04 
    5 2 测试新闻2 2011-12-04 
    6 3 测试新闻3 2011-12-03 
    8 2 测试新闻5 2011-12-02 
    9 1 测试新闻6 2011-12-02 
    10 2 测试新闻7 2011-12-01 
    11 3 测试通知新闻 2011-12-01 
    13 3 测试新闻9 2011-11-30 
    14 1 测试新闻10 2011-11-28
    16 2 测试通知新闻 2011-11-27
    我是不确认这个东西是不是可以用sql来做的,如果可以那最好,不行那只能程序里排了
      

  6.   

    #6楼说的那个是因为我只要cid是1,2,3的,那条是4的,所以就没有要的结果的描述在一楼写的很多了
    简单说就是“标题一样的,日期相隔1天的就只要一条,只要cid是1,2,3的数据”
      

  7.   

    mysql> select * from test;
    +----+------+--------------+------------+
    | id | cid  | title        | pubdate    |
    +----+------+--------------+------------+
    |  1 |    1 | 测试通知新闻 | 2011-12-05 |
    |  2 |    2 | 测试通知新闻 | 2011-12-05 |
    |  3 |    3 | 测试通知新闻 | 2011-12-04 |
    |  4 |    1 | 测试新闻1    | 2011-12-04 |
    |  5 |    2 | 测试新闻2    | 2011-12-04 |
    |  6 |    3 | 测试新闻3    | 2011-12-03 |
    |  7 |    4 | 测试新闻4    | 2011-12-02 |
    |  8 |    2 | 测试新闻5    | 2011-12-02 |
    |  9 |    1 | 测试新闻6    | 2011-12-02 |
    | 10 |    2 | 测试新闻7    | 2011-12-01 |
    | 11 |    3 | 测试通知新闻 | 2011-12-01 |
    | 12 |    2 | 测试通知新闻 | 2011-11-30 |
    | 13 |    3 | 测试新闻9    | 2011-11-30 |
    | 14 |    1 | 测试新闻10   | 2011-11-30 |
    | 15 |    4 | 测试新闻12   | 2011-11-28 |
    | 16 |    2 | 测试通知新闻 | 2011-11-27 |
    +----+------+--------------+------------+
    16 rows in set (0.01 sec)mysql> select *
        -> from test a
        -> where cid in (1,2,3)
        -> and not exists (
        ->  select 1 from test
        ->  where id<a.id and title=a.title
        ->  and pubdate between a.pubdate-interval 2 day and a.pubdate+interval 2 day
        ->  );
    +----+------+--------------+------------+
    | id | cid  | title        | pubdate    |
    +----+------+--------------+------------+
    |  1 |    1 | 测试通知新闻 | 2011-12-05 |
    |  4 |    1 | 测试新闻1    | 2011-12-04 |
    |  5 |    2 | 测试新闻2    | 2011-12-04 |
    |  6 |    3 | 测试新闻3    | 2011-12-03 |
    |  8 |    2 | 测试新闻5    | 2011-12-02 |
    |  9 |    1 | 测试新闻6    | 2011-12-02 |
    | 10 |    2 | 测试新闻7    | 2011-12-01 |
    | 11 |    3 | 测试通知新闻 | 2011-12-01 |
    | 13 |    3 | 测试新闻9    | 2011-11-30 |
    | 14 |    1 | 测试新闻10   | 2011-11-30 |
    | 16 |    2 | 测试通知新闻 | 2011-11-27 |
    +----+------+--------------+------------+
    11 rows in set (0.00 sec)mysql>