最近在做一个临时项目,采用的是mysql开发,主要涉及两个问题:1.一个是传参问题;2.另一个是实现对数据分组取前4的数据。个人感觉很有意义,特此记录一下。
一.传参问题
执行mysql文件,需要从外部传入参数时,mysql没有hive那么灵活,只有通过sed命令进行处理,比如有sql文件a.sql内容大致如下:
create table if not exists dp_collection.dc_sale_ztds_brand_base_week_info(
id INT PRIMARY KEY AUTO_INCREMENT,
plan_id varchar(60) default null comment '智投方案id',
brand_name varchar(60) default null comment '品牌名称',
put_model varchar(60) default null comment '投放模式',
sign_city varchar(60) default null comment '签约城市',
start_date_w varchar(60) default null comment '当前经营周开始日期',
end_date_w varchar(60) default null comment '当前经营周结束日期',
logo_url varchar(500) default null comment '品牌logo图片',
lbs_url varchar(500) default null comment 'LBS固定图片',
word_cloud_url varchar(500) default null comment '词云固定图片',
insert_time datetime default '1991-01-01 11:11:11' comment '入库时间',
update_time datetime DEFAULT CURRENT_TIMESTAMP comment '更新时间'
)
comment='xxx';
truncate table dp_collection.dc_sale_ztds_brand_base_week_info;
insert into dp_collection.dc_sale_ztds_brand_base_week_info(plan_id,brand_name,put_model,sign_city,start_date_w,end_date_w,logo_url,lbs_url,word_cloud_url,insert_time)
select
t1.plan_id
,t1.brand_name
,t1.put_model
,t1.sign_city
,t2.j_wfirst_date as start_date_w
,t2.j_wend_date as end_date_w
,t1.logo_url
,t1.lbs_url
,t1.word_cloud_url
,now() as insert_time
from dp_collection.dc_sale_ztds_brand_base_info t1
left join dp_collection.dim_date t2 on t2.`date`=@current_date;
执行的命令大致如下:
sed -i "1 i\ set @current_date='$current_date';" ztds_brand_lanuch_info.sql
mysql -h1.1.1.1 -udp_collection -pxxxxxx -Ddp_collection
sed -i "1d" a.sql
主要是先通过替换sql的变量,然后再还原的用法。
(ps:注意a.sql文件里面不能有中文,否则执行会报错)
二.mysql组内分组取数
该sql主要是通过先查询出t1的数据,然后一条一条和where子查询里面的数据进行对比,取出每个分组中的前4条,这种用法感觉有点巧妙,
sql文件内容:SELECT t1.plan_id,t1.launch_city FROM dp_collection.ztds_brand_city_info_tmp t1 WHERE 4>(SELECT COUNT(*) FROM dp_collection.ztds_brand_city_info_tmp
WHERE plan_id=t1.plan_id and plan_launch_point_num>t1.plan_launch_point_num) ORDER BY t1.plan_id,t1.plan_launch_point_num desc;
通过explain查看,可以看出该语法的性能很差,后期可以考虑其他方式进行优化。