更新查询同表问题与筛选最后一条记录问题

总结一下平时写业务sql遇到的问题。。


有这么一个需求,首先表结构信息如下图所示:

想要查询出slaveMerchantNo为M100077750或者M100065707,且bindStatus为30的最后一次出现的记录,为该记录设置unbindTime当前系统时间。


对于第一个条件我们slaveMerchantNo IN ('M100077750', 'M100065707'),然后在AND bindStatus = 30就可以,但是我们想要查询的是最后一条,因为一个slaveMerchantNo可能有多条记录,所以我们要进行分组(GROUP BY slaveMerchantNo ),然后再筛选出最后一条,这里可以条件判断为时间最大,但因为这张表加了自增itemID,所以直接使用了MAX(itemID),这样同样可以选出最后一条。于是,我们的sql是这样的:

	UPDATE tbl_fsm_settle_activity_mergeRecord
	SET unbindTime = NOW()
	WHERE
		itemID IN (
					SELECT
						MAX(itemID) itemID
					FROM
						tbl_fsm_settle_activity_mergeRecord
					WHERE
						slaveMerchantNo IN ('M100077750', 'M100065707')
					AND bindStatus = 30
					GROUP BY
						slaveMerchantNo
        )

执行发现报错,错误信息如下:

1093-You can’t specify target table for update in FROM clause

 该错误原因是:mysql不允许update目标表和子查询里面的表为同一张表。也就是update语句中包含的子查询的表和update的表为同一张表时,就会报上面这样的错误。所以为了避免这个错误,我们可以给子查询再嵌套一层,最终sql如下:

	UPDATE tbl_fsm_settle_activity_mergeRecord
	SET unbindTime = NOW()
	WHERE
		itemID IN (
			SELECT
				tb1.itemID
			FROM
				(
					SELECT
						MAX(itemID) itemID
					FROM
						tbl_fsm_settle_activity_mergeRecord
					WHERE
						slaveMerchantNo IN ('M100077750', 'M100065707')
					AND bindStatus = 30
					GROUP BY
						slaveMerchantNo
				) tb1
        )

这样的话,mysql就会认为再update中的子查询是查的tb1这张表,就不会再报错了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值