Mysql使用diff diff SQL_CALC_FOUND_ROWS的多个用户导致diff diff total row count

时间:2018-02-12 19:05:16

标签: mysql node.js

我在我们的系统中使用了多个不同的查询,我们想要为分页内容获取“总”记录。

我所有的地方都遵循这种结构 -

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基于其他查询“总”计数。

我不知道这里发生了什么,完全是空白。

需要帮助。

谢谢

2 个答案:

答案 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()语句的可能性也会增加