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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/H_233/article/details/87795483

总结一下平时写业务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这张表,就不会再报错了。

猜你喜欢

转载自blog.csdn.net/H_233/article/details/87795483