我是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;
});
答案 0 :(得分:1)
我认为在单独的表中有2个答案列与规范化相反,单个答案列就足够了,可以简化您的问题。
例如,假设我们将问题/问题表定义为: -
CREATE TABLE problems (problemid INTEGER PRIMARY KEY, problem TEXT, answer TEXT)
有一个用户表定义为: -
CREATE TABLE users (userid INTEGER PRIMARY KEY, username TEXT)
最后有一个答案表定义为: -
CREATE TABLE answers (userref INTEGER, problemref INTEGER, answer INTEGER DEFAULT 0, PRIMARY KEY (userref, problemref))
以下查询将产生排行榜: -
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列。您只需插入行(如果您想要重新尝试,请检查插入是否正常,然后更新行)。