Как выполнить сгруппированный рейтинг в MySQL

Однократная настройка?

Исходя из моего понимания, вам нужна однократная настройка. Ваш код в порядке, единственная проблема, которую я вижу, состоит в том, что когда вы снова открываете приложение, оно начинается с самого начала. Это связано с тем, что в вашем коде нет логики, чтобы проверить, выполнили ли вы одноразовую настройку. Для этого вы можете использовать SharedPreference.
Вы можете создать Splash Activity и проверить, выполнена ли разовая настройка или нет на основе логического флага.

Итак, в первый раз пользователь открывает приложение
SplashActivity -> NewUserActivity ---> GameChooseActivity
в противном случае
[ 1110] SplashActivity -> GameChooseActivity

blockquote>
SplashActivity extends AppcompatActivity{

   boolean hasDoneSetUp = false;
   private SharedPreferences pref;
   private Editor editor;

   protected void onCreate(Bundle sis)
   {
      super.onCreate(sis);
      setContentView(R.layout.splash);

      pref = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE); 
      editor = pref.edit();

      hasDoneSetUp = checkForSetUp();

      if(!hasDoneSetUp)
         startOneTimeSetUp();
      else
         startGameChooseActivity();

    }
}

Как выполнить одноразовую настройку?

Установите hasDoneSetUp значение true, когда будет выполнена одноразовая настройка, и сохраните это значение. в SharedPreference, чтобы при повторном открытии приложения проверялось, была ли выполнена однократная настройка или нет.

Сохраните ваши другие данные в SharedPreference или SQLiteDatabase и получите эти данные в GameChooseActivity.

public void startOneTimeSetUp(){

    if(!TextUtils.isEmpty(editUsername.getText().toString().trim())) {
                uploadUserData();
                Intent intent = new Intent(SplashActivity.this, GameChooseActivity.class);

                SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", MODE_PRIVATE); 
                Editor editor = pref.edit();
                editor.putBoolean("hasDoneSetup", true);           
                editor.commit(); 

                finish();
            }
}


public boolean checkForSetUp(){

     return pref.getBoolean("hasDoneSetup", true);
}

public void startGameChooseActivity(){
     Intent intent = new Intent(SplashActivity.this, GameChooseActivity.class);
     startActivity(intent);
}

Соответствующие ссылки

Если вы не знаете Что такое SharedPreference?
Если вы не знаете, как использовать SharedPreference [ 116] отметьте это

29
задан Community 23 May 2017 в 11:54
поделиться

3 ответа

SELECT id_student, id_class, grade,
   @student:=CASE WHEN @class <> id_class THEN 0 ELSE @student+1 END AS rn,
   @class:=id_class AS clset
FROM
  (SELECT @student:= -1) s,
  (SELECT @class:= -1) c,
  (SELECT *
   FROM mytable
   ORDER BY id_class, id_student
  ) t

Это работает очень простым способом:

  1. Начальный запрос заказан id_class первый, 112-секундный.
  2. @student и @class инициализируются к -1
  3. @class, используется, чтобы протестировать, если следующий набор вводится. Если предыдущее значение id_class (который хранится в @class) не равно текущему значению (который хранится в id_class), эти @student обнуляется. Иначе, увеличен.
  4. @class присвоен с новым значением [1 112], и оно будет использоваться в тесте на шаге 3 в следующей строке.
32
ответ дан Quassnoi 28 November 2019 в 01:27
поделиться

Я сделал некоторый поиск, найденный эта статья для предложения этого решения:

SELECT S2.*, 
FIND_IN_SET(
S2.GRADE
, (
SELECT GROUP_CONCAT(GRADE ORDER BY GRADE DESC)
FROM Students S1
WHERE S1.ID_CLASS = S2.ID_CLASS
)
) AS RANK
FROM Students S2 ORDER BY ID_CLASS, GRADE DESC;

Какие-либо мысли, на которых лучше?

1
ответ дан achinda99 28 November 2019 в 01:27
поделиться

Измененный сверху, это работает, но его более сложное, чем я думаю, что это должно быть:

SELECT ID_STUDENT, ID_CLASS, GRADE, RANK
FROM
    (SELECT ID_STUDENT, ID_CLASS, GRADE,
        @student:=CASE WHEN @class <> id_class THEN 1 ELSE @student+1 END AS RANK,
        @class:=id_class AS CLASS
    FROM
        (SELECT @student:= 0) AS s,
        (SELECT @class:= 0) AS c,
        (SELECT * 
            FROM Students
            ORDER BY ID_CLASS, GRADE DESC
        ) AS temp
    ) AS temp2
5
ответ дан achinda99 28 November 2019 в 01:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: