php - mysql UPDATE 多行多键 效率

标签 php mysql mysqli

我已经开始工作了,但是我问我是否可以做得更好(最好以某种方式减少 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/

相关文章:

php - MySQLi 查询在没有任何结果时给出错误

php - 将数据导入与其他数据库具有相同结构的数据库

mysql - 如何根据条件更新记录?

mysql - 添加 header 以跨连接查询

php - 数组值不起作用

php - 无需管理员登录,通过sql读取数据库

php - 为什么 mysqli QUERY 有效,但相同的 PREPARED 语句版本返回 SQL 语法错误?

php - SugarCRM - 如何为所有用户设置默认主页

php - 使用 nl2br 将 textarea 新行保存到 mysql ...如何很好地将数据返回到文本框?

javascript - 如何在浏览器中绕过 CORS 安全性?