如何用循环从MySQL逐行取数据?求分配评委评分代码的帮助
解决MySQL逐行取分并分配给对应部门&评委的问题
嘿,我看了你的代码和需求,发现现有逻辑存在明显的问题——它会把同一条分数记录重复分配给所有部门的所有评委,这肯定不是你想要的效果。咱们来梳理下正确的实现思路,再调整代码。
原代码的核心问题
你当前的循环结构是:先取一行分数,然后嵌套遍历所有部门和评委,把这个分数反复添加给每个部门的每个评委。这完全违背了“3位评委的分数对应对应部门”的需求。
正确的实现逻辑(分两种场景)
场景1:数据库分数按「部门+评委顺序」存储
假设你的scores表中,分数是按「每个部门对应3位评委的分数连续排列」的规则存储(比如部门1的3个分数→部门2的3个分数→...),那循环结构要反过来:先遍历部门,再对每个部门遍历评委,每次取一行对应的分数。
修正后的代码:
int score; String sql = "SELECT score FROM scores"; ResultSet rs = stmt.executeQuery(sql); // 遍历每个部门 for (int i = 0; i < al.getNumOfDepartments(); i++) { Department currentDept = al.getDepartment(i); // 为当前部门分配3位评委的分数 for (int j = 0; j < jl.getNumOfJudges(); j++) { // 确保还有下一行分数记录 if (rs.next()) { score = rs.getInt("score"); Judge currentJudge = jl.getJudge(j); Score scoreObj = new Score(score, currentJudge); currentDept.addScore(scoreObj); } else { // 处理数据库分数记录不足的异常情况 System.err.println("警告:数据库中的分数记录数量不足!"); break; } } }
场景2:数据库有部门/评委关联字段(更推荐)
如果你的scores表本身就有department_id和judge_id字段(用来关联对应的部门和评委),那更严谨的做法是通过SQL关联查询,直接精准匹配,不用依赖记录顺序:
// 关联查询分数、评委和部门的对应关系 String sql = "SELECT s.score, j.id AS judge_id, d.id AS dept_id " + "FROM scores s " + "JOIN judges j ON s.judge_id = j.id " + "JOIN departments d ON s.department_id = d.id"; ResultSet rs = stmt.executeQuery(sql); // 遍历所有匹配的结果 while (rs.next()) { int score = rs.getInt("score"); int judgeId = rs.getInt("judge_id"); int deptId = rs.getInt("dept_id"); // 根据ID获取对应的评委和部门(需要你实现这两个根据ID查询的方法) Judge targetJudge = jl.getJudgeById(judgeId); Department targetDept = al.getDepartmentById(deptId); if (targetJudge != null && targetDept != null) { Score scoreObj = new Score(score, targetJudge); targetDept.addScore(scoreObj); } }
这个方法更可靠,因为它不依赖数据库中记录的排列顺序,而是通过关联字段精准匹配,适合数据可能乱序的生产场景。
内容的提问来源于stack exchange,提问作者Abderahim Ennejjai
相关产品推荐
相关产品推荐

