如何在node.js中组合mysql select语句?

时间:2014-05-07 06:01:09

标签: mysql node.js

我想运行select语句,然后存储结果。但是我不想把它们联合在一起。

我有这个:

function downloaddata() {
    connection.query("SELECT * FROM players", function(err, rows, fields) {
        if (err) {
            console.log(err.message);
        } else {
            downloadwalls(rows);
        }
    });
}
function downloadwalls(playerdata) {
    connection.query("SELECT * FROM walls", function(err, rows, fields) {
        if (err) {
            console.log(err.message);
        } else {
            downloadprojectiles(playerdata, rows);
        }
    });
}
function downloadprojectiles(playerdata, walldata) {
    connection.query("SELECT * FROM projectiles", function(err, rows, fields) {
        if (err) {
            console.log(err.message);
        } else {
            gamedata = {
                data : playerdata,
                walls : walldata,
                projectiles : rows
            };
            downloaddata();
        }
    });
}

我基本上将函数链接到完成时调用下一个函数,然后永远重复它。

有没有办法可以将它们组合起来像

    connection.query("SELECT * FROM walls; SELECT * FROM ...; SELECT * FROM ...", function(err, rows, fields) {
        // here 'rows' would be an array of arrays of rows...
    });

请注意,每个表都有不同的列,因此我无法将它们合并。

有人知道某种方式吗?

1 个答案:

答案 0 :(得分:0)

这是一个很好的新版本的Forkbomb,只是它填充堆栈线性而不是exponentiell。或者有node.js Tail Recursion Detection?

技术解决方案:绝对从函数中删除链接调用。除去这些功能之外,它们无法提供帮助,因为您现在无法从外部拨打电话。

function load_data{
    while(true){
        connection.query("SELECT * FROM players", function(err, rows, fields) {
            if (err) {
                console.log(err.message);
            } else {
                gamedata['data'] = rows;
            }
        });
        connection.query("SELECT * FROM walls", function(err, rows, fields) {
            if (err) {
                console.log(err.message);
            } else {
                gamedata['walls'] = rows;
            }
        });
        connection.query("SELECT * FROM projectiles", function(err, rows, fields) {
            if (err) {
                console.log(err.message);
            } else {
                gamedata['projectiles'] = rows
            }
        });
    }
}

但不要期望服务器对此感到高兴!

绝对考虑一下Redis-Message-Subscribe方案,以及#34;新的"问题,因为你会阻塞node.js和MySQL-Server上的整个CPU。将数据存储在数据库中并发送消息。我认为node.js甚至带来了一些很好的消息传递信息来同步服务器之间的数据。

如果你必须通过MySQL来做,那么创建一个"差异"表和存储每个插入,删除,更新玩家,墙壁,射弹和#34;差异"表通过触发器。当5个用户处于非活动状态且1个处于活动状态时,您只需要阅读此单个更新播放器。所以diff表可以作为Message表使用,你可以删除看到的消息。