我已经开始工作了,但是我问我是否可以做得更好(最好以某种方式减少WHERE中所有条件的数量),或者是否有一种方法可以减少执行时间(尽管这似乎可行)比PHP循环每个更新查询要快得多。
我必须用7个主键更新表中的多行(生产一次可能在100-10000之间)(是的。我几乎只想粘贴一个主ID键在上面,但是我必须回去重新编码我的浏览器游戏的大部分内容……) 我不能使用INSERT .. ON KEY DUPLICATE,因为如果更新不存在,我就不应该插入更新(在更新之前在同一张表上做一些删除操作)
我当前的解决方案:
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)
那么,有没有更好的方法(较短的查询)或更快的方法(执行)呢?
答案 0 :(得分:0)
好吧,我设法找到一种大大缩短查询的方法,而它的工作原理几乎相同(我希望...,我的有限测试似乎执行相同的操作,请对此进行更正),所以我在发布我自己的答案...
方法如下(不要介意使用的数据略有不同,请注意结构的变化):
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,...)来缩短查询...下一步是否要检查(我只会缩短)缺少“ =“ ...大声笑)