【问题标题】:Sqlite: Insert or Update table with information from another tableSqlite:使用来自另一个表的信息插入或更新表
【发布时间】:2018-07-21 13:05:25
【问题描述】:

我是 sqlite 的新手,正在创建一个 Discord 琐事机器人,它有一个排行榜,可以跟踪每个用户的正确答案数量。我不确定如何在新人正确回答问题时添加新行,或者在另一个已经得到正确答案的人正确回答问题时更新行。我在下面的代码仅更新答案表中第一个 userId 的排行榜表。但答案表中可能有多个用户可以正确回答问题。

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

表格说明如下:

在名为 answers 的表中跟踪用户的答案。表 answers 具有属性 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;
});

【问题讨论】:

  • 您的console.error 语句有效吗?我认为你应该在每个.catch() 声明中做这样的事情:.catch(err => { console.error(err); });

标签: node.js sqlite discord.js


【解决方案1】:

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

例如假设我们有一个问题/问题表定义为:-

CREATE TABLE problems (problemid INTEGER PRIMARY KEY, problem TEXT, answer TEXT)
  • 根据以下示例填充了 2 个问题:-

有一个用户表定义为:-

CREATE TABLE users (userid INTEGER PRIMARY KEY, username TEXT)
  • 其中填充了 3 个用户:-

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

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

  • 所以第一行表示用户 1 (Fred) 错误地回答了问题 1。
  • 第二行表示 Fred 正确回答了问题 2。
  • 第三次,Bert 错误地回答了问题 2。
  • 第四次汤姆正确回答了问题 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

看起来像:-

然后您只需维护 1 列。您只需插入该行(如果您想满足重新尝试的需求,请检查插入是否正确,然后更新该行)。

【讨论】:

    猜你喜欢
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    相关资源
    最近更新 更多