Как выбрать случайные строки N с помощью чистого SQL?

private DatabaseReference rootRef,userRef;

получить инициализацию firebase в методе oncreare

rootRef = FirebaseDatabase.getInstance().getReference();
userRef = rootRef.child("Users");  

здесь код для проверки электронной почты существует или нет

userRef.orderByChild("email").equalTo(emailEdt.getText().toString())
            .addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    hideProgress();
                    if (dataSnapshot.exists()){
                        Toast.makeText(LoginActivity.this,"User already exists",Toast.LENGTH_SHORT).show();
                    }else {
                        UserLogin user = new UserLogin(emailEdt.getText().toString(),profilePath);
                        DatabaseReference db = userRef.push();
                        db.setValue(user);
                        //Log.d(TAG,"user key is::: "+db.getKey());
                        prefs.savEmail(emailEdt.getText().toString());
                        prefs.savProfileUrl(profilePath);
                        prefs.savKey(db.getKey());
                        openMainActivity();
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {
                    hideProgress();
                    Toast.makeText(LoginActivity.this,databaseError.getMessage(),Toast.LENGTH_SHORT).show();
                }
            });
10
задан Community 23 May 2017 в 10:32
поделиться

2 ответа

Я не знаю о чистом ANSI, и это не просто, но можно проверить мой ответ на подобный вопрос здесь: Простые Случайные выборки от базы данных Sql

2
ответ дан 4 December 2019 в 03:17
поделиться

Ответ на Ваш вопрос находится во второй ссылке там:

SELECT * FROM table ORDER BY RAND() LIMIT 1

Просто измените предел и/или перепишите для SQL Server:

SELECT TOP 1 * FROM table ORDER BY newid()

Теперь, это строго отвечает на Ваш вопрос, но Вы действительно не должны использовать это решение. Просто попробуйте его на большой таблице, и Вы будете видеть то, что я имею в виду.

Если Ваше ключевое пространство последовательно, или без дыр, или с очень немногими дырами, и если оно имеет очень немного дыр, Вы не слишком обеспокоены, что некоторые строки имеют немного более высокий шанс того, чтобы быть выбранным, чем другие, то можно использовать изменение, где Вы вычисляете, какой ключ Вы хотите получить случайным образом, в пределах от 1 к самому высокому ключу в Вашей таблице, и затем получить первую строку, которая имеет ключ, равный, или выше, чем число Вы вычислили. Вам только нужно "выше, чем" часть, если Ваше ключевое пространство имеет дыры.

Этот SQL оставляют как осуществление для читателя.


Править: Отметьте, комментарий к другому ответу здесь упоминает, что, возможно, чистый SQL означает стандарт ANSI SQL. Если это так, затем нет никакого пути, так как нет никакой стандартизированной случайной функции, и при этом каждый механизм базы данных не рассматривает функцию случайного числа тот же путь. По крайней мере один механизм, который я видел, "оптимизирует" вызов путем вызова его однажды и просто повторения расчетного значения для всех строк.

5
ответ дан 4 December 2019 в 03:17
поделиться
Другие вопросы по тегам:

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