大家好。
我有一个简单查询的问题。
来吧,这就是代码。
UPDATE user_resources AS ures
LEFT JOIN user_buildings as ub
ON ub.city_id = ures.city_id
INNER JOIN building_consumption AS bcons
ON bcons.resource_id = ures.resource_id
SET ures.quantity = ures.quantity - abs(FORMULA HERE that requires
building level and consumption at lvl 1 [default])
WHERE
(SELECT COUNT(id) FROM building_consumption AS bc2
WHERE bc2.building_id=ub.building_id) =
(SELECT COUNT(bc3.id) FROM building_consumption AS bc3
LEFT JOIN tmp_user_resources AS ures
ON ures.resource_id = bc3.resource_id
WHERE ures.city_id = ub.city_id
AND bc3.building_id=ub.building_id
AND bc3.quantity>0
AND IFNULL(ures.quantity, 0) - abs(FORMULA AGAIN);
我会试着解释一下。
可以想象,这是一款游戏。用户(玩家)可以在不同的城市拥有不同的建筑物。
标签 user_buildings
|id, city_id, buildings_id, level, usage|
一个建筑可以生产不同的资源标签 building_production
|id, building_id, resource_id, quantity_h|
但它也可以消耗一些资源:tab building_consumption
|id, building_id, resource_id, quantity_h|
显然,如果没有足够的资源来消耗他的工作,一座建筑就无法生产。这就是为什么我试图比较 WHERE SELECT COUNT 它必须消耗多少资源以及它实际可以消耗多少资源。
Mysql 不允许在 UPDATE stmt 中对同一个表进行子查询。
使用游标+循环太慢了。我更喜欢使用不同的解决方案。
临时表可能是一个解决方案,但我现在的问题是如何在没有触发器的情况下更新临时表?(UPDATE + SELECT 触发触发器并避免无限循环 mysql 阻止查询,我无法暂停/恢复触发器,因为
IF ((@TRIGGER_CHECKS = FALSE)
OR (@TRIGGER_BEFORE_INSERT_CHECKS = FALSE))
AND (USER() = 'root@localhost')
THEN
LEAVE thisTrigger;
END IF;
位于触发器本身内部)。
我愿意接受你的所有建议!
谢谢
PS 代码必须在预定事件中。