假设有帖子表,有以下字段:
CREATE TABLE `Post` (
  `ID` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `Title` varchar(200) NOT NULL COMMENT '标题',
  `State` int(11) NOT NULL COMMENT '状态',
  `PublishTime` datetime NOT NULL COMMENT '发帖时间',
  `UserID` int(11) NOT NULL COMMENT '用户ID',
  `UserIP` varchar(30) NOT NULL COMMENT 'IP',
  `Content` text NOT NULL COMMENT '帖子内容',
  PRIMARY KEY (`ID`),
  KEY `UserID_IDX` (`UserID`),
  KEY `PublishTime_IDX` (`PublishTime`),
) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=utf8
有这样一个需求,首页显示最新发表的30条帖子,但是每个用户的帖子数不能超过3条,我们是用二次查询做的,先取前90条,分组一下,把COUNT(*)加起来看是不是大于30了,如果是则把每个用户ID的最新帖子UNION ALL,不知道有没有更好的解决办法?

解决方案 »

  1.   

    单条sql不好实现  本身这个逻辑就有些问题,如果一个人连发五个帖子 就能看到三个  人家能不投诉?
      

  2.   

    按分组取完后,再取前30个参考下贴中的多种方法http://topic.csdn.net/u/20091231/16/2f268740-391e-40f2-a15e-f243b2c925ab.html
    [征集]分组取最大N条记录方法征集,及散分....
      

  3.   

    select *
    from post a
    where 3>(select count(*) from Post where UserID=a.UserID and PublishTime>a.PublishTime)
    order by PublishTime desc limit 30;
      

  4.   

    这样可以得到结果,不过效率不高,帖子有50W左右,要近1分钟,以下效率要高SELECT * FROM Post GROUP BY UserID HAVING COUNT(ID)<4 ORDER BY PublishTime DESC LIMIT 0,30
      

  5.   

    楼上的正解:elect *
    from post a
    where 3>(select count(*) from Post where UserID=a.UserID and PublishTime>a.PublishTime ORDER BY PublishTime LIMIT 0,200)
    order by PublishTime desc limit 30;
    看取多少条记录,这个很关键!
      

  6.   

    SELECT * FROM Post GROUP BY UserID HAVING COUNT(ID)<4 ORDER BY PublishTime DESC LIMIT 0,30
    这明显不对嘛