需分别获得一个大类下的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;
}觉得这样效率较差,不知有没有更好的方法?
大类:新闻资讯
小类:国内新闻、国际新闻、公司动态要求:
从这三个小类别里各取最新的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;
}觉得这样效率较差,不知有没有更好的方法?
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
[征集]分组取最大N条记录方法征集,及散分....
http://topic.csdn.net/u/20091231/16/2f268740-391e-40f2-a15e-f243b2c925ab.html?49369
中我的回答
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);
-- 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;