需分别获得一个大类下的N个小类各前5条记录,不知用什么方法比较好?例如:
大类:新闻资讯
小类:国内新闻、国际新闻、公司动态要求:
从这三个小类别里各取最新的5条记录,并可单独赋值予三个数组,以便在前台模板上可单个列表。现在的做法是foreach分别取:
foreach($news_type as $key => $val){
$result = $this->db->query("SELECT * FROM article WHERE type_id='$val' ORDER BY id DESC LIMIT 5");
$array_list[$key] = $result;
}觉得这样效率较差,不知有没有更好的方法?

解决方案 »

  1.   

    用一条语句去出来  效率和你循环取其实差不多
    SELECT * FROM article A WHERE 5>=(select count(*) from article B where A.type_id=B.type_id and A.id<B.id)
    order by id desc
      

  2.   

    参考下贴中的多种方法http://blog.csdn.net/acmain_chm/article/details/4126306
    [征集]分组取最大N条记录方法征集,及散分....
      

  3.   

    参考:
    http://topic.csdn.net/u/20091231/16/2f268740-391e-40f2-a15e-f243b2c925ab.html?49369
    中我的回答
      

  4.   

    谢谢各位!上述的几个方法都试了,没达到想要的结果。因为我的大小类是放在一个字段的,相对不好操作。type_id字段:1,3,5,9,13,23平时查询用:find_in_set(3,type_id)
      

  5.   

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

  6.   

    模拟了点数据。表:article
    INSERT INTO `article` VALUES (1, '1,4', '国内title1', '2012-1-20 21:07:35');
    INSERT INTO `article` VALUES (2, '1,4', '国内title2', '2012-1-21 21:07:35');
    INSERT INTO `article` VALUES (3, '1,4', '国内title3', '2012-1-21 22:07:35');
    INSERT INTO `article` VALUES (4, '2,5', '国际title1', '2012-1-22 21:07:35');
    INSERT INTO `article` VALUES (5, '2,5', '国际title2', '2012-1-23 21:07:35');
    INSERT INTO `article` VALUES (6, '2,5', '国际title3', '2012-2-27 17:17:28');
    INSERT INTO `article` VALUES (7, '1,4', '国内title4', '2012-2-27 17:19:58');
    INSERT INTO `article` VALUES (8, '3,6', '本地title1', '2012-5-27 17:21:20');
    INSERT INTO `article` VALUES (9, '3,6', '本地title2', '2012-5-28 17:22:35');
    INSERT INTO `article` VALUES (10, '2,5', '国际title4', '2012-5-29 17:23:04');
    INSERT INTO `article` VALUES (11, '3,6', '本地title3', '2012-5-29 17:26:31');期待结果:
    id type_id   title         posted_date
    7 1,4 国内title4 2012/2/27 17:19:58
    3 1,4 国内title3 2012/1/21 22:07:35
    10 2,5 国际title4 2012/5/29 17:23:04
    6 2,5 国际title3 2012/2/27 17:17:28
    11 3,6 本地title3 2012/5/29 17:26:31
    9 3,6 本地title2 2012/5/28 17:22:35要求是必须使用find_in_set()查找,以上结果是用UNION ALL获取的。(SELECT * FROM article WHERE find_in_set('4',type_id) ORDER BY id DESC LIMIT 2)
    UNION ALL
    (SELECT * FROM article WHERE find_in_set('5',type_id) ORDER BY id DESC LIMIT 2)
    UNION ALL
    (SELECT * FROM article WHERE find_in_set('6',type_id) ORDER BY id DESC LIMIT 2);
      

  7.   

    -- ----------------------------
    -- Table structure for `article`
    -- ----------------------------
    DROP TABLE IF EXISTS `article`;
    CREATE TABLE `article` (
      `id` int(8) NOT NULL AUTO_INCREMENT,
      `type_id` varchar(32) DEFAULT NULL,
      `title` varchar(50) DEFAULT NULL,
      `posted_date` datetime DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;