我有一个node.js服务器,它使用node-mysql连接池来查询MySQL数据库。
我需要进行SELECT
查询,该查询使用用户定义的变量来添加前一行的总和。在查询之前,我SET
将变量初始化为0。
SET @sum:=0;
SELECT *, @sum := @sum + `value` AS SUM FROM `table`;
查询按预期工作,但我担心如果同时向我的节点服务器发出多个请求会发生什么。服务器将进行多次查询。它们是否会相互碰撞并相互影响,每个都会增加相同的变量?如果是,我该如何防止这种情况?
最好的情况是将变量的范围限制为只有一个SELECT
查询。这样我就可以删除SET
语句并将@sum
包裹在ISNULL
中。所以结果将是
SELECT *, @sum := ISNULL(@sum,0) + `value` AS SUM FROM `table`;
但我不知道如何限制范围,因此在此查询结束时@sum
保留在结束值,对于下一个查询,它不是{{1}所以它不再从0递增。
无论如何,我可以保留null
,但需要确保使用相同连接的多个查询不会相互影响。我不知道MySQL如何处理查询,所以这可能不是问题,但我需要确定。
感谢您的帮助!
答案 0 :(得分:2)
您不必担心增加相同数字的不同查询。不同的查询在不同的线程或进程中运行,需要一些工作才能让它们共享数据。
但是,您只能使用一个语句编写查询:
SELECT t.*, @sum := @sum + `value` AS SUM
FROM `table` t CROSS JOIN
(SELECT @sum := 0) params;
MySQL确保在FROM
之前评估SELECT
子句,因此在使用变量之前对其进行初始化。