我已经开始工作了,但是我问我是否可以做得更好(最好以某种方式减少 WHERE 中所有条件的数量),或者是否有一种方法可以减少执行时间(尽管这似乎有效)比 PHP 循环每个更新查询快得多)。
我必须在一个有 7 个主键的表中更新多行(一旦投入生产,可能会在 100-10000 行之间)(是的..我几乎已经到了我只想坚持一个主 id 键的地步了就可以了,但我必须回去重新编码我的浏览器游戏……) 我无法使用 INSERT .. ON KEY DUPLICATE 因为如果更新不再存在,我就不应该插入更新(在更新之前在同一个表上执行一些 REMOVE)
我当前的解决方案:
UPDATE planet_market SET
amount = CASE
WHEN resource_id=1 AND type=0 AND price=2000 AND player_id=-1 AND planet_id=1 AND owner_type=2 AND factory_id=70 THEN 1
WHEN resource_id=1 AND type=0 AND price=2700 AND player_id=-1 AND planet_id=1 AND owner_type=2 AND factory_id=161 THEN 181
ELSE amount END
WHERE (resource_id=1 AND type=0 AND price=2000 AND player_id=-1 AND planet_id=1 AND owner_type=2 AND factory_id=70) OR (resource_id=1 AND type=0 AND price=2700 AND player_id=-1 AND planet_id=1 AND owner_type=2 AND factory_id=161)
那么有没有更好(更短的查询)或更快(执行)的方法来做到这一点?
最佳答案
好吧,我设法找到一种方法来大大缩短查询,同时它的工作原理几乎相同(我希望......,我有限的测试似乎执行相同的操作,请纠正我),所以我发布我自己的答案...
方法如下(不要介意使用的数据略有不同,请注意结构变化):
UPDATE planet_market SET
amount = CASE
WHEN resource_id=3 AND type=0 AND price=2147483647 AND player_id=9 AND planet_id=2 AND owner_type=0 AND factory_id=-1 THEN amount + 1
WHEN resource_id=4 AND type=0 AND price=250000 AND player_id=8 AND planet_id=2 AND owner_type=0 AND factory_id=-1 THEN amount + 1
ELSE amount END
WHERE (resource_id, type, price, player_id, planet_id, owner_type, factory_id) IN ((3,0,2147483647,9,2,0,-1),(4,0,250000,8,2,0,-1))
还有其他想法吗?
我希望这可以帮助其他人寻找这样的解决方案(我无法在 stackoverflow 上找到有关当您有多个键时更新多行的任何其他信息)
我想知道是否可以通过在 WHEN THEN 中使用 WHERE (column1,column2,...) IN (data1,data2,...) 来缩短查询...接下来要检查一下(我只会缩短它缺少“=”...哈哈)
关于php - mysql UPDATE 多行多键 效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53168598/