Node.JS + MySQL – 将40多个UPDATE语句凝聚成一个,每个语句都有独特的WHERE子句

我试图制作一个冷却系统,包含一个MySQL数据库来存储冷却时间的“剩余时间”。 我目前有大约50个冷却时间pipe理,每秒更新数据库。 是的,我需要1秒钟的准确性,不,我不能使用variables,因为数据需要在应用程序重新启动后生存。 所以这是我的代码:

function cooldowns() { connection.query("UPDATE users SET col1 = col1 - 1 WHERE col1 > 0") connection.query("UPDATE users SET col2 = col2 - 1 WHERE col2 > 0") connection.query("UPDATE users SET col3 = col3 - 1 WHERE col3 > 0") connection.query("UPDATE users SET col4 = col4 - 1 WHERE col4 > 0") connection.query("UPDATE users SET col5 = col5 - 1 WHERE col5 > 0") connection.query("UPDATE users SET col6 = col6 - 1 WHERE col6 > 0") connection.query("UPDATE users SET col7 = col7 - 1 WHERE col7 > 0") connection.query("UPDATE users SET col8 = col8 - 1 WHERE col8 > 0") } 

我有这些线路,其中约40-50 …全部用于不同的列。 现在我知道我可以按照UPDATE users SET col1 = asd, col2 = asdf, etc方式做一些事情UPDATE users SET col1 = asd, col2 = asdf, etc但问题在于WHERE子句对每个查询都是唯一的。 我怎样才能将所有这一切缩小到只有一个查询? 请注意,整个函数的表名是相同的,但是列和WHERE子句不是。

在目前的情况下,似乎运行多个查询是唯一的select。

然而,从你的例子看来,所有在这里更新的列是数字,条件是确保值不低于零。

如果这是你正在寻找的唯一的限制,你可以采取不同的方法。 改变你的模式,将每列的数据types从Int更改为Int UNSIGNED 。 这将自动确保值不低于零。 分配一个负值到这个列将存储零而不是。

现在使用新的模式,您可以运行单个查询,如:

 function cooldowns() { connection.query("UPDATE users SET col1 = col1 - 1, col2 = col2 - 1, col3 = col3 -1 ..."); } 

where子句可以完全被跳过,或者修改为select行的其他必要条件。