通常我的做法是先查询出所有栏目的ID,再根据栏目ID查询出每个栏目的N条记录,然后再将数据缓存
今天在PHPX上看到有人问我一样遇到的问题:
如下图
一共有16记录 cat_id代表栏目
目前有 9 10 11 12
四个栏目
我想最后取出8条记录 每个栏目各取最新的两条,最优化的SQL语句怎么写?

天行健:直接union四个select语句,谓之最简单的想法
millken 给出了写法(未测试)
(SELECT * FROM table WHERE cat_id =9 ORDER BY article_id DESC LIMIT 2)
UNION
(SELECT * FROM table WHERE cat_id =10 ORDER BY article_id DESC LIMIT 2)
UNION
(SELECT * FROM table WHERE cat_id =11 ORDER BY article_id DESC LIMIT 2)
UNION
(SELECT * FROM table WHERE cat_id =12 ORDER BY article_id DESC LIMIT 2)
最后还是楼主根据高人写法改了一下
SELECT a.article_id, a.cat_id, a.title,c.cat_name FROM ecs_article AS a left join ecs_article_cat as c on a.cat_id=c.cat_id INNER JOIN ecs_article AS b ON a.cat_id = b.cat_id AND a.article_id <= b.article_id and a.cat_id >= 9 and a.cat_id <=12
GROUP BY a.cat_id,a.article_id HAVING (COUNT(*) <= 2) order by a.cat_id desc
不知道这个性能如何? 有办法再优化此SQL吗?
我的建议是既然查询出来了,先生成静态或者缓存这部分数据,隔定多长时间更新,如果一定要实时更新这有些不现实,如果数据量大兼访问量大时就算服务器支撑没问题,也是一个巨大的浪费