我有两个表,一个包含大学名称和大学 ID,另一个包含不同大学的学生逐年入学情况。
我想要的是打印不同学院一年入学的学生人数以及每年入学的学生总数。
目前我正在做的是从第一个表中获取大学 ID,然后运行 for 循环一年并计算学生人数。
每次创建新的PreparedStatement时,都会在for循环内发生这种情况,我觉得这有点昂贵。有没有更好的方法来运行 SQL 查询来获取所需的数据。
我当前正在使用的代码如下
PreparedStatement pstmt = conn.prepareStatement("select id from college where type_flag = '1' order by full_form");
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
for (int i = 1964; i < 2019; i++) {
String pstmt11 = "select count(*) from students where id=" + rs.getInt("id") + "AND year = " + i;
//System.out.println(pstmt11);
PreparedStatement pstmt1 = conn.prepareStatement(pstmt11);
//pstmt1.setInt(1, rs.getInt("case_type"));
ResultSet rs1 = pstmt1.executeQuery();
while (rs1.next()) {
//Here I am getting the count
}
类似地,为了获得年份明智的计数,我也在做同样的事情。
最佳答案
您对 PreparedStatement
的使用并不是真正使用准备好的语句。您应该只使用值的占位符准备一次,然后使用setInt()
传递值。
PreparedStatement pstmt = conn.prepareStatement("select id from college where type_flag = '1' order by full_form");
PreparedStatement pstmt1 = conn.prepareStatement("select count(*) from students where id=? and year=?");
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
for (int i = 1964; i < 2019; i++) {
int id = rs.getInt("id");
pstmt1.setInt(1, id);
pstmt2.setInt(2, i);
ResultSet rs1 = pstmt1.executeQuery();
while (rs1.next()) {
//Here I am getting the count
}
}
}
您还应该在第一个语句中使用占位符。
<小时/>但是不需要一个循环或两个语句。您可以通过单个查询完成您想要的操作:
select id, year, count(*)
from students
where id in (select id
from college
where type_flag = '1')
and year between 1964 and 2018
group by id, year;
<小时/>
令我惊讶的是,college.id
等于 students
表中的 id
列。从命名的角度来看,我期望有一个 students.college_id
列,并且 students.id
是 students
表中标识学生的主键,而不是学院。
关于java - sql和java查询数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49334323/