欢迎投稿

今日深度:

创建角色随机名字(mysql抽取随机记录)和mysql游

创建角色随机名字(mysql抽取随机记录)和mysql游标的使用,mysql游标


最近在开发中遇到了一些问题,在此记录一下解决的方法,已作备忘。

1、现在创建游戏角色的时候,基本上都是支持角色名字随机的,以前此功能在客户端用代码实现,然后向服务器请求并验证,后来发现有时候连续几次都失败,所以改成在服务器实现。实现方法主要考虑使用mysql随机查询记录,在网上查了很多方案,然后用在了我们游戏中。

实现方案是,将所有随机名字都插入到一张表中,然后从中随机取一条当前角色表中没有出现过的名字。

BEGIN		
	DECLARE randnum int DEFAULT 0;
	SELECT FLOOR(RAND() * 309034) INTO randnum;
	SELECT rname INTO _name FROM `names` WHERE ((_sex = sex) AND
		(rname not in (SELECT Name FROM longwen.player WHERE _world = WorldID)) AND
		(id > randnum)) LIMIT 1;
		
	set returnvalue = 0;
END
2、接运营的需求,有时候因为服务器维护,需要给所有玩家送一些东西,这时候涉及离线玩家,所以我们的方案是静态写数据库。

因为对mysql没有深入研究过,在实践的过程中发现游标操作只能修改一条数据,后来查了很多资料,还是解决了问题,自己也学到了一点知识,修改后存储过程如下:

DECLARE _cursor CURSOR FOR 
SELECT RoleID FROM player WHERE (RoleID NOT IN (SELECT roleID FROM email where LENGTH(datas) <> 0)); 
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' set _done = 1;

OPEN _cursor;  
set _done = 0;
REPEAT
	FETCH _cursor into _roleId;
	replace into email(roleID, datas) values(_roleId, 'test');
UNTIL _done END REPEAT;
CLOSE _cursor;
修改前repeat里面有一条select语句。出现这个问题,主要是对SQLSTATE理解不够,02000异常有3种条件:

A:SELECT INTO 语句或 INSERT 语句的子查询的结果为空表。

B:在搜索的 UPDATE 或 DELETE 语句内标识的行数为零。

C:在 FETCH 语句中引用的游标位置处于结果表最后一行之后。

后来把select语句提出去放到游标声明语句里面就好了。



有一个mysql的数据表,我要随机抽取10条记录,用什方法最好

1.通过MYSQL内置的函数来操作,具体SQL代码如下:
SELECT * FROM tablename ORDER BY RAND() LIMIT 10
2.不要将大量的工作给数据库去做,这样会导致数据库在某一集中并发时间内锁死并阻塞。
建议通过PHP随机生成一下1-X(总行数)之间的数字,然后将这10个随机数字作为查询条件,具体语句如:
SELECT * FROM tablename where ID in (2,8,4,11,12,9,3,1,33)
可能你还要进行重复排除,并且需要在程序中将10个值串联并连接进入SQL语句中。
 

mysql从数据表中随机提取多条不同记录

mysql 使用 ORDER BY rand() 实现随机获取

mysql> select * FROM sale_report LIMIT 0, 10;
+---------------------+-----------+------------+
| SALE_DATE | SALE_ITEM | SALE_MONEY |
+---------------------+-----------+------------+
| 2009-01-01 00:00:00 | A | 2009.00 |
| 2009-01-01 00:00:00 | B | 1.00 |
| 2009-01-01 00:00:00 | C | 1.00 |
| 2009-01-02 00:00:00 | A | 2009.00 |
| 2009-01-02 00:00:00 | B | 1.00 |
| 2009-01-02 00:00:00 | C | 2.00 |
| 2009-01-03 00:00:00 | A | 2009.00 |
| 2009-01-03 00:00:00 | B | 1.00 |
| 2009-01-03 00:00:00 | C | 3.00 |
| 2009-01-04 00:00:00 | A | 2009.00 |
+---------------------+-----------+------------+
10 rows in set (0.00 sec)

mysql> select * FROM sale_report ORDER BY rand() LIMIT 0, 10;
+---------------------+-----------+------------+
| SALE_DATE | SALE_ITEM | SALE_MONEY |
+---------------------+-----------+------------+
| 2009-11-17 00:00:00 | A | 2009.00 |
| 2009-07-16 00:00:00 | A | 2009.00 |
| 2009-05-20 00:00:00 | C | 20.00 |
| 2009-10-14 00:00:00 | C | 14.00 |
| 2009-01-27 00:00:00 | A | 2009.00 |
| 2009-02-01 00:00:00 | B | 2.00 |
| 2009-07-29 00:00:00 | A | 2009.00 |
| 2009-11-20 00:00:00 | C | 20.00 |
| 2009-05-15 00:00:00 | A | 2009.00 |
| 2009-07-27 00:00:00 | B | 7.00......余下全文>>
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/3476.html NewsArticle 创建角色随机名字(mysql抽取随机记录)和mysql游标的使用,mysql游标 最近在开发中遇到了一些问题,在此记录一下解决的方法,已作备忘。 1、现在 创建游戏角色的时候,基本上都是支...
评论暂时关闭