1、MySQL 分组查询文章表各个分类的前N条数据
时间复杂度均为分组中条目数的二次方。而且,很多优化器都不能优化这种查询,使得它的耗时最好为全表行数的二次方(尤其在没有设置正确的索引时),而且数据量大时,可能将服务器会停止响应。SELECT A1.* FROM cd_app2_article AS A1 INNER JOIN (SELECT A.cate_id,A.create_time FROM cd_app2_article AS A LEFT JOIN cd_app2_article AS B ON A.create_time = B.create_time AND A.id <= B.id GROUP BY A.cate_id,A.create_time HAVING COUNT(B.id) <= 10 ) AS B1 ON A1.cate_id = B1.cate_id AND A1.create_time = B1.create_time
ORDER BY A1.cate_id,A1.create_time DESC//那么还有更好的方法吗?有没有办法可以仅仅扫描一次数据,而不是通过子查询进行多次扫描
//有,使用 UNION(SELECT * FROM cd_app2_article WHERE cate_id=1 ORDER BY id DESC LIMIT 10)
UNION ALL
(SELECT * FROM cd_app2_article WHERE cate_id=4 ORDER BY id DESC LIMIT 10)
UNION ALL
(SELECT * FROM cd_app2_article WHERE cate_id=7 ORDER BY id DESC LIMIT 10)//使用UNION的方式是一个很好的选择。而当你要获取数据表中大部分条目时也有一种能达到线性时间的方法,那//就是使用用户定义变量。太专业了,没去深究,给出别人的一个学习示例set @num := 0, @type := '';
selecttype, variety, price
from(
selecttype, variety, price,
@num := if(@type =type, @num + 1, 1)as row_number,
@type :=type as dummy
fromfruits
orderby type, price
)as x where x.row_number <= 2;
2、查询文章表中各个分类的总数
SELECT cate_id,COUNT(*) FROM cd_app2_article GROUP BY cate_id