如何获取MySQL列的位置?Discord机器人等级模块开发疑问
解决Discord机器人等级模块的用户排名获取问题
嘿,我来帮你搞定这个排名展示的难题!你的核心问题是已经按等级和经验排序了用户数据,但不知道怎么给每条数据添加上对应的排名。这里有两种靠谱的解决方案,你可以根据需求选:
方法一:让MySQL直接返回排名(更高效)
你可以利用MySQL的窗口函数ROW_NUMBER(),在查询时直接生成每个用户的排名,这样拿到结果就能直接用,不用再在JS里额外处理。
优化后的查询语句(注意参数化防注入)
// 用参数化查询替代字符串拼接,避免SQL注入风险! connection.query( `SELECT *, ROW_NUMBER() OVER (PARTITION BY GuildID ORDER BY UserLvl DESC, LevelExp DESC) AS UserRank FROM levels WHERE GuildID = ?`, [message.guild.id], // 把GuildID作为参数传入,安全又规范 function(error6, results6) { if (error6) { console.error('查询出错:', error6); return; } // 现在results6里每条记录都有UserRank字段,直接用就行 const userRecord = results6.find(user => user.UserID === message.author.id); if (userRecord) { message.channel.send(`你的当前排名是第 ${userRecord.UserRank} 名!`); } else { message.channel.send('你还没有等级记录哦~'); } } );
为什么用ROW_NUMBER()? 它会按照你指定的排序规则(等级降序、经验降序),给每个服务器的用户单独生成连续的排名,完美匹配你的需求。
方法二:在JavaScript中计算排名(无需改SQL)
如果你暂时不想调整SQL查询,也可以在拿到排序后的结果后,通过遍历索引来计算排名——因为查询结果已经是按规则排好序的,索引+1就是对应的排名。
示例代码
connection.query( `SELECT * FROM levels WHERE GuildID = ? ORDER BY UserLvl DESC, LevelExp DESC`, [message.guild.id], // 同样建议用参数化查询 function(error6, results6) { if (error6) { console.error('查询出错:', error6); return; } // 遍历结果,给每条数据添加排名 const rankedUsers = results6.map((user, index) => { return { ...user, UserRank: index + 1 }; }); // 找到当前用户的排名 const userRecord = rankedUsers.find(user => user.UserID === message.author.id); if (userRecord) { message.channel.send(`你的当前排名是第 ${userRecord.UserRank} 名!`); } else { message.channel.send('你还没有等级记录哦~'); } } );
小提示: 之前你试过forEach,其实它的第二个参数就是当前元素的索引,直接用index + 1就能得到排名,可能之前没注意到这个参数的用法~
重要提醒:SQL注入风险
你的原始代码里直接用${message.guild.id}拼接SQL语句,这是很危险的!哪怕GuildID是数字,也可能被恶意利用。一定要改用参数化查询(上面代码里的?占位符+参数数组),这是开发数据库应用的基本安全规范。
内容的提问来源于stack exchange,提问作者CherryPAVoice
相关产品推荐
相关产品推荐

