2014-12-01 1 views
0

Ok, так, например, моя таблица будет выглядеть следующим образом:Java ResultSet возвращается все записи после первой правильной записи находится из MySQL Query

 
┌──────┬────────┬─────────────┬───────────┐ 
│UserIDUsernameCurrentLeagueTotalPoints│ 
├──────┼────────┼─────────────┼───────────┤ 
│1  │Elliot │randomLeague │15   │ 
├──────┼────────┼─────────────┼───────────┤ 
│2  │Callum │randomLeague │20   │ 
├──────┼────────┼─────────────┼───────────┤ 
│3  │Rory │testLeague │17   │ 
├──────┼────────┼─────────────┼───────────┤ 
│4  │Admin │NULL   │0   │ 
├──────┼────────┼─────────────┼───────────┤ 
│5  │Steve │randomLeague │21   │ 
└──────┴────────┴─────────────┴───────────┘ 

И вот мой код в моем Java проекте для класса, который я Я использую здесь.

public int getLeaguePosition(String username) 
{ 
    try 
    { 
     int leaguePosition = 0; 
     String leagueName = getLeague(username); 
     System.out.println("League Name: " + leagueName); 
     ArrayList<SortingUser> sortingUser = new ArrayList<SortingUser>(); 
     String query = "SELECT * FROM Users WHERE CurrentLeague = ?"; 
     preparedStatement = connection.prepareStatement(query); 
     preparedStatement.setString(1, leagueName); 
     resultSet = preparedStatement.executeQuery(); 
     while(resultSet.next()) 
     { 
      String retrievedUsername = resultSet.getString("Username"); 
      System.out.println(retrievedUsername); 
      SortingUser retrievedUser = new SortingUser(retrievedUsername); 
      sortingUser.add(retrievedUser); 
     } 
     Collections.sort(sortingUser); 
     for(int i = 0; i < sortingUser.size(); i++) 
     { 
      SortingUser retrievedSortingUser = sortingUser.get(i); 
      String retrievedUsername = retrievedSortingUser.getUsername(); 
      if(retrievedUsername.contains(username) && username.contains(retrievedUsername)) 
      { 
       leaguePosition = i + 1; 
       System.out.println("League Position for " + username.toUpperCase() + " is " + leaguePosition); 
       return leaguePosition; 
      } 
     } 
    } 
    catch(Exception e) 
    { 
     System.out.println("Couldn't get league position for: " + username); 
     e.printStackTrace(); 
    } 
    return 0; 
} 

и если я дал его «Рори» в качестве имени пользователя было бы вернуть записи с ID 3, 4 и 5, а не только 3 при расчете позиции.

Зачем это происходит? Я уверен, что мой код верен, потому что, когда я копирую этот точный SQL-запрос в phpMyAdmin, он отлично работает.

+0

Вы возвращаете первое совпадающее положение лиги, что вы здесь задаете? Кстати, 'leaguePosition = i + 1;' выглядит неправильно для меня. –

+0

Что вы подразумеваете под «если я дал ему« Rory »как имя пользователя»? Ваш код не запрашивает имя пользователя. Он запрашивает имя лиги, а ваш запрос SQL запрашивает имя лиги. – Kenster

+0

@ElliottFrisch да, потому что массивы начинаются с 0, а позиция вещей в таблице начинается с 1. Например, первый столбец будет считан как столбец 0 вместо столбца 1. :) – Elliot

ответ

0

Я не уверен, что вы пытались сделать там с SortingUser, но я бы пошел с гораздо более простым кодом, и пусть SQL сделает свою собственную сортировку. Обычно это очень эффективно, особенно если у вас есть соответствующие индексы на столе.

public int getLeaguePosition(String username) 
{ 
    try 
    { 
     String leagueName = getLeague(username); 
     System.out.println("League Name: " + leagueName); 

     // This is returning all the users in the same league sorted by descending points. 

     String query = "SELECT * FROM Users WHERE CurrentLeague = ? ORDER BY TotalPoints DESC"; 
     preparedStatement = connection.prepareStatement(query); 
     preparedStatement.setString(1, leagueName); 
     resultSet = preparedStatement.executeQuery(); 

     int leaguePosition = 0; 
     while(resultSet.next()) 
     { 
      // Since the result set is already sorted, the first player has the most points, so his 
      // leaguePosition is one. The second has the next best number of points, so his position 
      // is two, and so on. So we keep the leaguePosition var based on the number of the row. 

      leaguePosition++; 

      // And if the user name retrieved actually matches the one that we passed, then this is 
      // his league position. 

      String retrievedUsername = resultSet.getString("Username"); 
      if (retrievedUsername.equals(username)) { 
       break; 
      } 

     } 
     resultSet.close(); 

     return leaguePosition; 

    } 
    catch(Exception e) 
    { 
     System.out.println("Couldn't get league position for: " + username); 
     e.printStackTrace(); 
    } 
    return 0; 
} 
+0

Спасибо, да, я не понимал, что SQL может сортировать вещи. Это облегчает работу. Все еще не понимаю, почему мой метод не работает. Но хорошо. Большое спасибо :) – Elliot

+0

Ну, вы не указали код для SortingUser, поэтому мы не можем сказать, была ли ваша сортировка правильной или нет. Как правило, при показе кода вы должны показывать весь код, который вызывается этим кодом (конечно, за исключением вещей, которые находятся в стандартных библиотеках). – RealSkeptic

0

Вы реализованы Comparable интерфейс в SortingUser класса?

Collections.sort() не будет сортировать объекты, если вы не реализовали Comparable в своем классе.

для простого примера проверка this вне !!

+0

Да, это буквально все классы сортировки, которые есть в нем, ну, а это и несколько геттеров и конструктор ха-ха. Но dw @RealSkeptic исправил мою проблему :) – Elliot