0

大家好。

我有一个简单查询的问题。
来吧,这就是代码。

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 代码必须在预定事件中。

4

0 回答 0