2014-12-18 1 views
1

У меня есть первый набор результатов, в котором я должен выполнять итерацию через userid и для каждого пользователя, мне нужно выполнить несколько select count (*), все из которых возвращают однозначные выходы. Если вы не поняли, что я сказал, пожалуйста, следуйте псевдокоду ниже:альтернатива jdbc resultset rs.next()

ResultSet rs = stmt.executeQuery("select userid from tablename"); 
while(rs.next()){ 
    String userid = rs.getString("userId"); 
    ResultSet rs1 = stmt.executeQuery("select count(*) as cnt1 from xxx.... where userId = "+userId); 
    if(rs1.next()) 
     String count1 = rs1.getString("cnt1"); 
    rs1.close(); 
    ResultSet rs2 = stmt.executeQuery("select count(*) as cnt2..."); 
    if(rs2.next()) 
     String count2 = rs2.getString("cnt2"); 
    rs2.close(); 
    .... 
    rs10.close(); 

Поскольку это неэффективно, я надеялся пройти Resultset каждый раз, написав какое-то прямой запрос для получения каждого отдельного счета подобный

String cnt1 = stmt.executeQuery("select count(*) as noE from useractiontable where curr_action='edit'" + " and userId = " + userId).getString("noE"); 

Я знаю, что подобное не может быть выполнено без использования rs.next() каждый раз. Подготавливает заявление путь? Есть ли другой способ? Признайте любые указатели в этом отношении.

+1

Если ваше подключение позволяет, используйте несколько операторов в одном запросе. –

+1

, потому что вы считаете, вы можете использовать здесь 'union '(каждый результат является конкретным подсчетом) –

+1

Выполнение запроса по объекту оператора закрывает любой ранее открытый набор результатов этого же оператора. Вам нужно использовать несколько операторов. –

ответ

2

Вы можете использовать group by для получения всех пользователей с COUNT (*)

ResultSet rs = stmt.executeQuery("select userid,count(*) from tablename group by userid"); 
+0

Ваш ответ достаточно близок к тому, что я пытаюсь выполнить. Вы намекнули мне, как я мог бы объединить все свои результаты в один запрос, используя группу. Наверное, это путь. Но ваш точный запрос неверен, поскольку я не писал четко определенные вопросы в вопросе. Тем не менее, я отмечу это как ответ. – rk567

0

Я подозреваю, что вы можете сделать все DB работу в одном запросе, а затем есть только один набор результатов для чтения. Это будет намного более эффективный и более чистый код. Я имею в виду что-то вроде:

select userid, count(*) as cnt 
from tablename t inner join othertablename ot on t.userid = ot.userid 
group by userid 

Если у вас есть другие столбцы в tablename, что вы хотите, вы бы добавить их в выбор и на группу по. Например:

select userid, username, count(*) as cnt 
from tablename t inner join othertablename ot on t.userid = ot.userid 
group by userid, username 

Приведенные выше запросы не возвращают идентификатор пользователя с нулевым значением. Если вам нужны нули, используйте внешнее соединение (и сделайте логику подсчета с нулевым случаем):

select userid, username, isnull(count(ot.userid), 0) as cnt 
from tablename t left outer join othertablename ot on t.userid = ot.userid 
group by userid, username