简记update碰到的一个小问题

今天在使用mysql 的update的时候碰到了这么个麻烦的问题,简记之。

问题起因:

我要给一张已经存在老用户数据的表增加一个字段,该表为充值表,目前已有字段为:

红色的字段是我要添加上去的,用来标识用户的本次充值是否为第一次充值,其实这个字段不加上也无所谓,根据pay_time 和user_id其实就可以作sql查询来统计相关功能了,但是为了以后统计的方便,我还是倾向于加上这么一个明了的字段。

因此,我就得给已经存在于数据库的所有记录来作判断,判断该条记录是否是该用户的首次充值。

于是我毫不犹豫,挥毫写下了这么一个sql:

UPDATE t_user_pay SET is_first = 1 
WHERE pay_index in
(select pay.pay_index FROM t_user_pay as pay, 
(
SELECT pay_index, MIN(pay_time) as m_time from t_user_pay 
GROUP BY user_id
) as b
WHERE pay.pay_time = b.m_time
);


这个SQL 也很容易理解,最里面一层查询出user_id 以及它对应的第一次充值时间

第二层查询出所有第一次充值的pay_index,然后由于pay_index是主键,因此在最外层使用update将pay_index所对应的is_first字段置为 1,由此完成了我们的需求。

结果,悲剧了,mysql爆出了这么一个错误:

很简单,update语句里面的查询条件不能是即将要被update的表。

原因就不分析了,这是mysql的内部机制。

那么,在朋友的帮助下,使用了另外一个方法,既然不能直接update是嘛,那好办,我把select查询出来之后的数据作临时保存,然后再进行update,这样由于查询条件不在原表了,这样总没问题了吧?

SQL如下:

drop  table if exists temp_pay ;
create TEMPORARY TABLE temp_pay(pay_index BIGINT);

insert into temp_pay(pay_index)
select a.pay_index
from t_user_pay as a,
(select user_id,min(pay_time) min_time from t_user_pay group by user_id) as b
where a.user_id = b.user_id and a.pay_time=b.min_time;


update t_user_pay set is_first=1
where pay_index in(select pay_index from temp_pay);
drop  table if exists temp_pay ;


ok了,

执行成功。

不过这样的方式效率不高,我暂时没有想到其他更好的办法,暂时记录之。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值