RSS
热门关键字:  php  lighttpd  找回密码  密码找回  client
当前位置 :| 主页>技术资料>MySQL>

MySQL实战 - 根据子查询更新本身数据表

来源: 作者: 时间:2008-09-16 Tag:update   mysql   子查询   点击:

项目开发过程中,我们经常需要去修改一些预设值,比如在一个关于统计学生成绩中,我们需要取得一个同学所有学期(或许跨度三个学年,也或许十年,这个不是关心的内容)的单一学科的平均成绩。这种例子很多,目前我接手的一个WEBGAME项目中,数值系统已经内置完毕,但在开发过程中,我们需要进行单一兵种的生产实例,于是需求产生了。

目前, 兵种的生产数值系统已经确定完毕,在单元测试中,因为不需要考虑过多的因素,比如科技,工厂的一些级别,所以只能按最低级的速度来测试,于是问题产生了。单独生产一个兵,即使是最底级的那种,大概也在30分钟之外。项目组决定将所有生产速度下调100倍,在MYSQL中,有一个函数在这里起了很大的作用:CEILINGMYSQL手册如下介绍:

CEILING(X) 
返回不小于 X 的最小整数: 
mysql> SELECT CEILING(1.23);
        -> 2
mysql> SELECT CEILING(-1.23);
        -> -1
 
注意,返回值被转换为一个 BIGINT

MYSQL在update更新时对子查询中规定,不允许更改在子查询中的表,也就是无法操作相同的表:UPDATE XXX SET XX=(SELECT XX FROM XXX) WHERE....这会导致一个警告错误,并且停止执行,于是改造更新语句如下:

 

UPDATE soldierattribrsh A ,
	(SELECT CEILING(`SoldierArributeValue`/100) AS ceils 
	FROM soldierattribrsh WHERE `SoldierArributeId`='13') B 
	SET A.SoldierArributeValue=B.ceils 
	WHERE A.`SoldierArributeId`='13'
Query通过!
最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册