1. 程式人生 > >MySQL儲存過程實現遊戲合服

MySQL儲存過程實現遊戲合服

DELIMITER $$

DROP PROCEDURE IF EXISTS `combine`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `combine`(IN fromdbs VARCHAR(200),IN todb VARCHAR(30))

BEGIN
DECLARE dsize INT DEFAULT 0;
DECLARE lastLoginId BIGINT DEFAULT -1;
DECLARE currentUUID BIGINT DEFAULT -1;
DECLARE currentLoginId BIGINT DEFAULT -1;
DECLARE done INT DEFAULT FALSE;
-- 遍歷playercache 通過 loginId,lv,gsPoint,uuid降序
DECLARE cur1 CURSOR FOR SELECT `uuid`,loginid FROM playercache  ORDER BY loginId DESC, lv DESC,gsPoint DESC,`uuid` DESC;
-- 遍歷廢棄玩家,條件是 等級小於20 ,30天類沒有升級
DECLARE cur2 CURSOR FOR SELECT `uuid` FROM playercache WHERE lv<20 AND (UNIX_TIMESTAMP(NOW())-(lvUpTime/1000))>30*24*60*60;
-- 遍歷有效玩家
DECLARE cur3 CURSOR FOR SELECT `uuid` FROM playercache;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
SET @needDeletes ='';
SET @count=CHAR_LENGTH(fromdbs)-CHAR_LENGTH(REPLACE(fromdbs,',','')) + 1;
SET @i=1;
ALTER TABLE pay MODIFY id BIGINT;
WHILE @i <= @count
DO
SET @fromdb=SUBSTRING_INDEX(SUBSTRING_INDEX(fromdbs,',',@i),',',-1);
SET @tail=SUBSTRING(@fromdb,5);
#合併bags表
SET @sql_bags=CONCAT('INSERT INTO ',todb,'.bags SELECT * FROM ',@fromdb,'.bags');
PREPARE pre_bags FROM @sql_bags;
EXECUTE pre_bags;
DEALLOCATE PREPARE pre_bags;
-- 合併friends表
SET @sql_friends=CONCAT('INSERT INTO ',todb,'.friends SELECT * FROM ',@fromdb,'.friends');
PREPARE pre_friends FROM @sql_friends;
EXECUTE pre_friends;
DEALLOCATE PREPARE pre_friends;
-- 合併heros表
SET @sql_heros=CONCAT('INSERT INTO ',todb,'.heros SELECT * FROM ',@fromdb,'.heros');
PREPARE pre_heros FROM @sql_heros;
EXECUTE pre_heros;
DEALLOCATE PREPARE pre_heros;
#合併mails表
SET @sql_mails=CONCAT('INSERT INTO ',todb,'.mails SELECT * FROM ',@fromdb,'.mails');
PREPARE pre_mails FROM @sql_mails;
EXECUTE pre_mails;
DEALLOCATE PREPARE pre_mails;
#合併offlines表
SET @sql_offlines=CONCAT('INSERT INTO ',todb,'.offlines SELECT * FROM ',@fromdb,'.offlines');
PREPARE pre_offlines FROM @sql_offlines;
EXECUTE pre_offlines;
DEALLOCATE PREPARE pre_offlines;
#合併pay表
SET @sql_pay=CONCAT('INSERT INTO ',todb,'.pay SELECT A.uuid,B.loginId,B.moneys FROM ',@fromdb,'.playercache A,',@fromdb,'.pay B WHERE A.loginId=B.loginId');
PREPARE pre_pay FROM @sql_pay;
EXECUTE pre_pay;
DEALLOCATE PREPARE pre_pay;
#合併player表
SET @sql_player=CONCAT('INSERT INTO ',todb,'.player SELECT * FROM ',@fromdb,'.player');
PREPARE pre_player FROM @sql_player;
EXECUTE pre_player;
DEALLOCATE PREPARE pre_player;
#合併playercache表
SET @sql_playercache=CONCAT('INSERT INTO ',todb,'.playercache SELECT * FROM ',@fromdb,'.playercache where loginId>0');
PREPARE pre_playercache FROM @sql_playercache;
EXECUTE pre_playercache;
DEALLOCATE PREPARE pre_playercache;
#合併rewardmission表
SET @sql_rewardmission=CONCAT('INSERT INTO ',todb,'.rewardmission SELECT * FROM ',@fromdb,'.rewardmission');
PREPARE pre_rewardmission FROM @sql_rewardmission;
EXECUTE pre_rewardmission;
DEALLOCATE PREPARE pre_rewardmission;
#合併tasks表
SET @sql_tasks=CONCAT('INSERT INTO ',todb,'.tasks SELECT * FROM ',@fromdb,'.tasks');
PREPARE pre_tasks FROM @sql_tasks;
EXECUTE pre_tasks;
DEALLOCATE PREPARE pre_tasks;
#合併tongs表
SET @sql_tongs=CONCAT('INSERT INTO ',todb,'.tongs SELECT CONCAT(',@tail,',tongId,"") tongId ,tong FROM ',@fromdb,'.tongs');
PREPARE pre_tongs FROM @sql_tongs;
EXECUTE pre_tongs;
DEALLOCATE PREPARE pre_tongs;
#設定資料庫下標,繼續下一個資料庫的合併
SET @
[email protected]
+1;
END WHILE;
 
#一個玩家多個角色只保留一個角色,保留等級高的,戰力高的
OPEN cur1;
loop1: LOOP
FETCH cur1 INTO currentUUID,currentLoginId;
IF done THEN
LEAVE loop1;
END IF;
IF (currentLoginId=lastLoginId) THEN
SET @needDeletes=CONCAT(@needDeletes,',',currentUUID);
SET dsize =dsize+1;
ELSE  
SET lastLoginId=currentLoginId;
END IF;
END LOOP;
CLOSE cur1;
IF (dsize>0) THEN
SET @needDeletes=SUBSTRING(@needDeletes,2);
#刪除廢棄的playercache資料
SET @del_sql_playercache =CONCAT('UPDATE playercache SET STATUS=1 WHERE `uuid` IN (',@needDeletes,')');
PREPARE del_playercache FROM @del_sql_playercache;
EXECUTE del_playercache;
DEALLOCATE PREPARE del_playercache;
#刪除廢棄的pay資料
SET @del_sql_pay =CONCAT('DELETE FROM pay WHERE id  IN (',@needDeletes,')');
PREPARE del_pay FROM @del_sql_pay;
EXECUTE del_pay;
DEALLOCATE PREPARE del_pay;
SET @needDeletes='';
SET dsize =0;
END IF;
-- 刪除低等級很多天沒登入的玩家資料
SET done=FALSE;
OPEN cur2;
loop2: LOOP
FETCH cur2 INTO currentUUID;
IF done THEN
LEAVE loop2;
END IF;
SET @needDeletes=CONCAT(@needDeletes,',',currentUUID);
SET dsize =dsize+1;
END LOOP;
CLOSE cur2;
IF (dsize>0) THEN
SET @needDeletes=SUBSTRING(@needDeletes,2);
#刪除廢棄的playercache資料
SET @del_sql_playercache =CONCAT('DELETE FROM playercache WHERE `uuid` IN (',@needDeletes,')');
PREPARE del_playercache FROM @del_sql_playercache;
EXECUTE del_playercache;
DEALLOCATE PREPARE del_playercache;
SET @needDeletes='';
SET dsize =0;
END IF;
SET done=FALSE;
OPEN cur3;
loop3: LOOP
FETCH cur3 INTO currentUUID;
IF done THEN
LEAVE loop3;
END IF;
SET @needDeletes=CONCAT(@needDeletes,',',currentUUID);
SET dsize =dsize+1;
END LOOP;
CLOSE cur3;
IF (dsize>0) THEN
SET @needDeletes=SUBSTRING(@needDeletes,2);
#刪除廢棄的bags資料
SET @del_sql_bags =CONCAT('DELETE FROM bags WHERE `uuid` NOT IN (',@needDeletes,')');
PREPARE del_bags FROM @del_sql_bags;
EXECUTE del_bags;
DEALLOCATE PREPARE del_bags;

#刪除廢棄的friends資料
SET @del_sql_friends =CONCAT('DELETE FROM friends WHERE `uuid` NOT IN (',@needDeletes,')');
PREPARE del_friends FROM @del_sql_friends;
EXECUTE del_friends;
DEALLOCATE PREPARE del_friends;

#刪除廢棄的heros資料
SET @del_sql_heros =CONCAT('DELETE FROM heros WHERE `uuid` NOT IN (',@needDeletes,')');
PREPARE del_heros FROM @del_sql_heros;
EXECUTE del_heros;
DEALLOCATE PREPARE del_heros;

#刪除廢棄的mails資料
SET @del_sql_mails =CONCAT('DELETE FROM mails WHERE `uuid` NOT IN (',@needDeletes,')');
PREPARE del_mails FROM @del_sql_mails;
EXECUTE del_mails;
DEALLOCATE PREPARE del_mails;

#刪除廢棄的offlines資料
SET @del_sql_offlines =CONCAT('DELETE FROM offlines WHERE `uuid` NOT IN (',@needDeletes,')');
PREPARE del_offlines FROM @del_sql_offlines;
EXECUTE del_offlines;
DEALLOCATE PREPARE del_offlines;

#刪除廢棄的pay資料
SET @del_sql_pay =CONCAT('DELETE FROM pay WHERE id NOT IN (',@needDeletes,')');
PREPARE del_pay FROM @del_sql_pay;
EXECUTE del_pay;
DEALLOCATE PREPARE del_pay;

#刪除廢棄的player資料
SET @del_sql_player =CONCAT('DELETE FROM player WHERE `uuid` NOT IN (',@needDeletes,')');
PREPARE del_player FROM @del_sql_player;
EXECUTE del_player;
DEALLOCATE PREPARE del_player;

#刪除廢棄的rewardmission資料
SET @del_sql_rewardmission =CONCAT('DELETE FROM rewardmission WHERE `uuid` NOT IN (',@needDeletes,')');
PREPARE del_rewardmission FROM @del_sql_rewardmission;
EXECUTE del_rewardmission;
DEALLOCATE PREPARE del_rewardmission;

#刪除廢棄的tasks資料
SET @del_sql_tasks =CONCAT('DELETE FROM tasks WHERE `uuid` NOT IN (',@needDeletes,')');
PREPARE del_tasks FROM @del_sql_tasks;
EXECUTE del_tasks;
DEALLOCATE PREPARE del_tasks;

SET @needDeletes='';
SET dsize =0;
END IF;
-- 重名資料處理
UPDATE playercache E,(SELECT A.uuid,A.name,@no:
[email protected]
+1 nbr  FROM playercache A,(SELECT @no:=0)C,(SELECT NAME,MIN(createtime) createtime,COUNT(NAME) num FROM playercache 
GROUP BY NAME HAVING COUNT(num)>1)B WHERE A.name=B.name AND A.createtime>B.createtime) F SET E.name=CONCAT(F.name,F.nbr,'@') WHERE E.uuid =F.uuid;

-- 將pay的id 變成 int型別
UPDATE pay D, (SELECT (@num:
[email protected]
+1) num,id FROM pay A,(SELECT @num:=0) B) C SET D.id =C.num WHERE D.id=C.id;

ALTER TABLE pay MODIFY id INT;
END$$
DELIMITER ;

相關推薦

MySQL儲存過程實現遊戲

DELIMITER $$ DROP PROCEDURE IF EXISTS `combine`$$ CREATE DEFINER=`root`@`localhost` PROCEDURE `combine`(IN fromdbs VARCHAR(200),IN todb

MySQL儲存過程實現動態執行SQL

  create procedure p_procedurecode(in sumdate varchar(10)) begin      declare v_sql varchar(500);    #需要

mysql 儲存過程實現非集合

mysql 儲存過程實現非集合 DELIMITER $$ CREATE FUNCTION `func_get_split_str_total`( f_string varchar(10000),f_delimiter varchar(50) ) RETURNS int(11) BEGI

mysql儲存過程實現遞迴查詢

-- 建表create table _organization(    orgcode varchar(40) not null primary key comment '機構編號',    parentcode varchar(40) comment '父機構編號',   

使用Navicat 建立mysql儲存過程實現日期加流水號序列

                                      &nb

MySQL基礎系列之 記一次利用儲存過程實現2600萬資料水平分表

日常開發中我們經常會遇到大表的情況,所謂的大表是指儲存了百萬級乃至千萬級條記錄的表。這樣的表過於龐大,導致資料庫在查詢和插入的時候耗時太長,效能低下,如果涉及聯合查詢的情況,效能會更加糟糕。分表的目的就是減少資料庫的負擔,提高資料庫的效率,通常點來講就是提高表的增刪改查效率,本文將介紹我

mysql儲存過程的坑(關於declare與具體實現順序)

先上程式碼 BEGIN DECLARE hotelId BIGINT DEFAULT 0; DECLARE done int DEFAULT FALSE; DECLARE tbtypeId BIGINT DEFAULT 0; SELECT id into

MySQL 基於儲存過程 實現資料統計按日、周、月份統計模板

儲存過程developer_count 是根據傳入引數searchType 決定是使用那種查詢方式,本儲存過程中包含的其他的引數是{起始時間:startime,結束時間:endtime} CREATE PROCEDURE developer_count ( search

MySQL任務排程和儲存過程實現實時修改表中欄位值

DELIMITER $$USE `wqd_zw_platform`$$DROP PROCEDURE IF EXISTS `update_activity_state`$$CREATE DEFINER=`root`@`localhost` PROCEDURE `update_activity_state`()B

MySQL儲存過程實現更新UUID

背景交代: 原有資料表中只有自增的id,現在需要新新增一個UUID的列。(UUID不需要“-”) 解決方法: 首先,如果你連自增的id列都沒有,可以先生成一個自增id列,就算有資料了也

MYSQL中利用儲存過程實現模糊查詢

今做資料庫課程設計時,課設要求利用儲存過程實現模糊查詢。第一次聽到這樣的要求感覺很荒謬,會不會是要求寫錯了。在此我為我的無知感到羞愧。廢話不多說,接下來我們講一下在MYSQL資料庫中如何利用儲存過程實現模糊查詢呢? 假如我們在資料庫中建有這樣的一個表: 接下來我們直接上儲

mysql儲存過程以"陣列"形式入參實現表間複製 並實現回滾

這個程式碼是我需要實現,前端稽核某個稽核後,這個資料會在另一個頁面中呈現,涉及到兩個資料庫表。一下內容是用於測試的程式碼。 前端進行處理,將id封裝成陣列後提交到Java後臺,"陣列"使用 - 來分隔,是因為入參時,我使用了逗號,但是測試失敗了,就改用-或空格 在點提交後

mysql通過儲存過程實現aes加解密

前言:資料庫難免會存一些敏感資料,密碼可以用不可逆演算法,但是有些東西本來就需要可逆,比如使用者銀行卡號、身份證號、手機號等,mysql自身提供了AES_ENCRYPT、AES_DECRYPT來實現aes的加解密,但是利用格式為AES_ENCRYPT('需要加密的字元','

mysql利用儲存過程實現對資料庫資料的遷移

CREATE DEFINER=`root`@`localhost` PROCEDURE `insertXX`() BEGIN declare AA int default 0; #聲明後續

從零開始寫MySql儲存過程(四)通過儲存過程實現階乘的計算

   首先,我認為在實際的開發中,應該沒人會用儲存過程去計算階乘,但是用這個作為練習我覺得還是挺不錯的,因為通過這個儲存過程的編寫可以熟悉引數型別,儲存過程內部使用自定義變數,迴圈結構的語法的使用mysql> create procedure jiecheng(in p

Mysql儲存過程8:repeat循環

local cal 其他 host ted query code class pan 語法: repeat SQL until 條件 end repeat; 就是相當於其他語言中的: do{ # }while(); mys

Mysql儲存過程4:mysql變量設置

from 默認 pan procedure weight use mysql變量 sql 寫法 默認全局變量是兩個@@開頭, 可用show variables查看所有默認變量: @@user #declare定義變量只能用在儲存過程中 #declare 變量名 數據類型

Mysql儲存過程3:if語句

sql語句 inpu arguments ted div mysql then for clas --if/else語句 if 條件 then SQL語句 else SQL語句elseifSQL語句 end if; create procedure test1( n

Mysql儲存過程2:變量定義與參數傳遞

變量定義 color ted lec mysq 傳遞 參數傳遞 fault 可選 #儲存過程 中的變量定義 declare 變量名 類型 可選類型 -- 跟建表差不多 create procedure p() begin declare age int de

MySQL 儲存過程-原理、語法、函數詳細說明

exp sql 十六進制 作用範圍 安全機制 系統管理員 rtrim 編程 xtra Mysql儲存過程是一組為了完成特定功能的SQL語句集,經過編譯之後存儲在數據庫中,當需要使用該組SQL語句時用戶只需要通過指定儲存過程的名字並給定參數就可以調用執行它了,簡而言之就是一組