我在我们的系统中使用了多个不同的查询,我们想要为分页内容获取“总”记录。
我所有的地方都遵循这种结构 -
var query1 = "select SQL_CALC_FOUND_ROWS ...."
sql.query(query1, [], function (error, results, fields) {
var _qry2 = "SELECT FOUND_ROWS() as total;"
sql.query(_qry2, [], function (error2, results2, fields2) {
});
});
我在这里遇到的问题是,当1-10个用户使用我的所有系统时,它会为所有API提供正确的“总计”。
但是当没有。当用户使用所有API中的一个时,“总数”计数不断变化。
所以说如果245中的“总”行,有时它给我18,有时300,有时245基于其他查询“总”计数。
我不知道这里发生了什么,完全是空白。
需要帮助。
谢谢
答案 0 :(得分:1)
您必须使用相同的连接才能获得可靠的结果,而不仅仅是池中的一个。
sql.getConnection(function(err, conn) {
if (err) throw err;
conn.query("SELECT SQL_CALC_FOUND_ROWS * FROM table", [], function(err, result) {
if (err) {
conn.release(); // give connection back to the pool
throw err;
}
conn.query("SELECT FOUND_ROWS() as total", [], function(err, result) {
if (err) {
conn.release(); // give connection back to the pool
throw err;
}
let total = result[0].total;
conn.release();
});
});
});
答案 1 :(得分:0)
您遇到并发问题。 FOUND_ROWS()
返回为最后执行的select语句返回的行数。
https://dev.mysql.com/doc/refman/8.0/en/information-functions.html#function_found-rows
通过FOUND_ROWS()可用的行计数是瞬时的,不是 打算在SELECT之后的语句之后可用 SQL_CALC_FOUND_ROWS语句。
随着用户数量的增加,在初始SELECT
和您执行SELECT
之间执行另一条FOUND_ROWS()
语句的可能性也会增加