code
说明
初始化
SQL
语句
:
set work_mem to '1GB';
Create table info(
id numeric not null primary key ,
titlevarchar(100) ,
Viewnum numeric ,
info_type_id numeric ,
Code text
);
create index info_infotypeid on info (info_type_id);
Create table info_type(
Id numeric not null primary key,
Name varchar(100)
);
--
插入
100
个新闻分类
Insert into info_type
select id, 'TYPE' || lpad(id::text, 5, '0' ) from generate_series(1, 100) id;
--
插入
1000000
个新闻
Insert into info_type
select id, 'TTL' || lpad(id::text, 20, '0' ) title, ceil(random()*10000) views,
ceil(random()*10000) info_type_id , md5(id) code
from generate_series(1, 1000000) id;
vacuum analyse info_type,info;
2
.核心思想
通常我们在取前
N
条记录时候,都是根据某个业务字段进行降序排序,然后取前
N
条。
例如“
select * from info order by views asc limit 3”
,这条
SQL
就是取
info
表中
的前
3
条记录。但是“它是在每个类型下都要取浏览量的前
3
条记录”。
另一种比较简单粗暴的方式是在
Java
代码中循环所有的资讯类型,取出每个类型的前
3
条记录,最后进行汇总。但是,这种方式虽然也能实现我们的要求,但存在严重的弊端 ,
即有可能发送多次(成百上千次也有可能)
sql
语句。这种程序显然是有重大缺陷的。
如果能够在查询每条资讯记录时能查出其所在类型的排名,然后根据排名字段进行过
滤,是否也能解决该问题?这时候我们就想到了子查询,并且
MySQL
是可以实现这样的
功能子查询的。
要计算出某条资讯信息在同资讯分类下所有记录中排第几名,换算出有多少条浏览量
文档被以下合辑收录
评论