Sqlite:使用另一个表中的信息插入或更新表

时间:2018-02-11 04:16:56

标签: node.js sqlite discord.js

我是sqlite的新手,我正在创建一个Discord trivia bot,它有一个跟踪每个用户正确答案数量的排行榜。我不知道如何在新人获得正确的问题时添加新行,或者当另一个已经得到答案的人正确回答一个时更新行。我在下面的代码只更新了答案表中第一个userId的排行榜表。但是答案表中可能有多个用户可以正确地解决问题。

我正在使用库discord.js和sqlite。

表格的描述如下:

在名为答案的表格中跟踪用户的答案。表格答案具有userId和answer属性。 userId是给出答案的用户的id,答案是用户的选择。

还有另一个名为排行榜的表,用于跟踪每个用户拥有的正确答案的数量。表排行榜的属性是userId和number。 userId是用户的id,number是正确答案的数量。

cAnswer = 'c';
sql.get(`SELECT * FROM answers WHERE answer ="${cAnswer}"`).then(aRow => {
    if (aRow){
        sql.get(`SELECT * FROM leaderboard WHERE userId ="${aRow.userId}"`).then(lRow => {
            if (!lRow){
                sql.run("INSERT INTO leaderboard (userId, number) VALUES (?, ?)", [aRow.userId, 1]);
            }
            else{
                num = lRow.number + 1;
                sql.run(`UPDATE leaderboard SET number = ${num} WHERE userId = ${aRow.userId}`);
            }
            const user = client.users.get(aRow.userId);
            user.send("You answered the jeep trivia question correctly!\nThe correct answer was *" + cAnswer + "*.");
        }).catch(() => {
            console.error;
            sql.run("CREATE TABLE IF NOT EXISTS leaderboard (userId TEXT, number INT)").then(() => {
                sql.run("INSERT INTO leaderboard (userId, number) VALUES (?, ?)", [aRow.userId, 1]);
            });
            const user = client.users.get(aRow.userId);
            user.send("You answered the jeep trivia question correctly!\nThe correct answer was *" + cAnswer + "*.");
        });
    }

}).catch(() => {
    console.error;
});

1 个答案:

答案 0 :(得分:1)

我认为在单独的表中有2个答案列与规范化相反,单个答案列就足够了,可以简化您的问题。

例如,假设我们将问题/问题表定义为: -

CREATE TABLE problems (problemid INTEGER PRIMARY KEY, problem TEXT, answer TEXT)
  • 根据以下两个问题填写示例: - enter image description here

有一个用户表定义为: -

CREATE TABLE users (userid INTEGER PRIMARY KEY, username TEXT)
  • 其中包含3位用户: - enter image description here

最后有一个答案表定义为: -

CREATE TABLE answers (userref INTEGER, problemref INTEGER, answer INTEGER DEFAULT 0, PRIMARY KEY (userref, problemref))
  • 其中填充了一些答案(注意答案列将包含0表示错误答案,1表示正确答案),userref列引用相应用户,problemref列引用相应问题: -

enter image description here

  • 所以第一行是说用户1(Fred)错误地回答了问题1。
  • 第二行说Fred正确回答了问题2.
  • 第3,Bert错误地回答了问题2。
  • 第四,Tom正确回答了问题2。

以下查询将产生排行榜: -

SELECT username||' got '||sum(answers.answer)||' correct.' AS number_correct
FROM answers 
    JOIN users ON userref = userid
GROUP BY userref ORDER BY sum(answers.answer) DESC

看起来像是: -

enter image description here

然后您只需要维护1列。您只需插入行(如果您想要重新尝试,请检查插入是否正常,然后更新行)。