随机推送数据
需求:對商品表按照好評、暢銷、特價等維度隨機推送給用戶.
解決方法:通過split_string結合存儲過程的for循環解決該問題.
Mysql:
DROP PROCEDURE IF EXISTS pro_gen_recomondcomm; CREATE PROCEDURE `pro_gen_recomondcomm`(IN haveorder bit,IN classify int,IN proceeDate varchar(20)) BEGINDECLARE isfestival bit;DECLARE havepurchase bit;DECLARE category int;DECLARE ratevals VARCHAR(20);DECLARE nums INT;DECLARE selnumrate INT;DECLARE commentrate INT;DECLARE bargainrate INT;DECLARE i INT;DECLARE areacnt INT;DECLARE localarea VARCHAR(20);SET isfestival = 0;SET havepurchase = haveorder;SET category = classify;/*刪除已有的當天的數據**/TRUNCATE TABLE shenl_bi_recommend_comm2;call pro_gen_area;IF isfestival = 0 AND haveorder = 0 THENSELECT ordered,rates,total INTO haveorder,ratevals,nums FROM shenl_bi_metadata WHERE classify = category AND type = 1 AND ordered = havepurchase;SELECT CAST(split_string(ratevals, ',',1) AS decimal(9,2))*nums, CAST(split_string(ratevals, ',',2) AS decimal(9,2))*nums, CAST(split_string(ratevals, ',',3) AS decimal(9,2))*numsINTO selnumrate,commentrate,bargainrate;SELECT MAX(rank) INTO areacnt FROM(SELECT @row_number:=@row_number+1 AS rank,area FROM (SELECT DISTINCT area AS area FROM shenl_bi_temp_carryable )area,(SELECT @row_number:=0) AS tORDER BY area DESC) A;SET i = 1;while i<=areacnt do SELECT area INTO localarea FROM(SELECT @row_number:=@row_number+1 AS rank,area FROM (SELECT DISTINCT area AS area FROM shenl_bi_temp_carryable )area,(SELECT @row_number:=0) AS tORDER BY area DESC) A WHERE A.rank = i;/* add 生成各個城市的邏輯*/INSERT INTO shenl_bi_recommend_comm2(gid,source,processdate,cityid)/**以熱銷維度來推薦商品 **/SELECT gid,source,proceeDate,localarea FROM (SELECT gid,1 AS source,str_to_date(proceeDate,'%Y-%m-%d') AS proceeDate,localarea FROM(SELECT gid,sellnum FROM shenl_bi_temp_carryable WHERE area = localareaORDER BY sellnum DESC LIMIT selnumrate)BORDER BY RAND())C;/**以特價維度來推 **/ INSERT INTO shenl_bi_recommend_comm2(gid,source,processdate,cityid) SELECT A.gid,2 as "source", A.proceeDate,A.area FROM(SELECT gid,str_to_date(proceeDate,'%Y-%m-%d') AS proceeDate,localarea as area FROM(SELECT gid FROM shenl_bi_temp_carryable WHERE bargain=1 AND area = localareaORDER BY RAND() LIMIT bargainrate)A)A LEFT JOIN (SELECT gid,processdate,cityid FROM shenl_bi_recommend_comm2 WHERE processdate = proceeDate AND cityid = localarea) B ON A.gid = B.gid AND A.proceeDate = B.processdate AND A.area = localarea WHERE B.gid IS NULL;/**以好評維度推 **/ INSERT INTO shenl_bi_recommend_comm2(gid,source,processdate,cityid) SELECT A.gid,3 as "source", A.proceeDate,A.area FROM(SELECT gid,str_to_date(proceeDate,'%Y-%m-%d') AS proceeDate,localarea as area FROM(SELECT gid FROM(SELECT gid,rate FROM shenl_bi_temp_carryable WHERE area = localareaORDER BY rate DESC LIMIT commentrate)BORDER BY RAND())A)A LEFT JOIN (SELECT gid,processdate,cityid FROM shenl_bi_recommend_comm2 WHERE processdate = proceeDate AND cityid = localarea) B ON A.gid = B.gid AND A.proceeDate = B.processdate AND A.area = localarea WHERE B.gid IS NULL;SET i=i+1;END WHILE;END IF;/**隨機追加推,每個city取出12條數據 **/ INSERT INTO shenl_bi_recommend_comm2(gid,source,processdate,cityid) SELECT B.gid,5 as "source",str_to_date(proceeDate,'%Y-%m-%d') AS proceeDate,area FROM(SELECT gid,area FROM(SELECT A.gid FROM shenl_goods A WHERE A.g_status = 1 AND A.g_num > 0ORDER BY RAND() LIMIT 12)ACROSS JOIN (SELECT DISTINCT area FROM shenl_bi_temp_carryable) BORDER BY area, RAND())B LEFT JOIN shenl_bi_recommend_comm2 C ON C.gid = B.gid AND C.cityid = B.area WHERE C.gid IS NULL;END;代碼解讀:
1)? 設定IN haveorder bit,IN classify int,IN proceeDate varchar(20)如下3個參數
2)?call pro_gen_area;調用依賴的存儲過程
3)? 先刪除當天跑的數據TRUNCATETABLE md_bi_recommend_comm2;
4)? 如果參數滿足某個條件則執行:IF isfestival =0AND haveorder =0THEN
5)? 每一種推送數據策略對應一個source,hardcode一個數數字編碼
6)? 如果left join依次避免本次的數據和上一結果集重復
LEFT?JOIN
(SELECT?gid,processdate,cityid?FROM?md_bi_recommend_comm2?WHERE?processdate?=?proceeDate?AND?cityid?=localarea)B
ON?A.gid?=?B.gid?AND?A.proceeDate?=?B.processdate?AND?A.area?=?localarea
WHERE?B.gid?IS?NULL;
總結
- 上一篇: win10怎么设置切换系统语言包 如何设
- 下一篇: 数据同步结合Crontab