Я тоже пытаюсь придумать, как это сделать. На данный момент я думаю о следующих трех альтернативах:
1) выберите случайные строки, игнорирующие критерии, затем отбросьте те, которые не соответствуют на уровне приложения, и выберите больше случайных строк, если необходимо. Этот метод будет эффективен, если ваш критерий соответствует множеству строк в вашей таблице, возможно, 20% или более (необходимо провести сравнительный анализ)
2) выберите строки, соответствующие критериям, и выберите строку на основе случайного числа от 1 до счетчика (*) (случайное число, определенное в приложении). Это будет эффективно, если данные, соответствующие критериям, распределены равномерно, но ужасно потерпит неудачу, если, например, вы выбираете диапазон дат, и большинство случайных чисел попадет в записи за пределами этого диапазона.
3) моя любимая на данный момент, но и самая большая работа. Для каждой комбинации критериев, которую вы собираетесь использовать для выбора случайной записи, вы вставляете запись в специальную таблицу для этих критериев. Затем вы выбираете случайные записи из специальной таблицы и возвращаетесь к своим данным. Например, у вас может быть такая таблица:
Настольный кот: имя, возраст, цвет глаз, тип меха
Если вы хотите иметь возможность выбирать случайных кошек с коричневым мехом, то вам нужен такой стол:
Таблица cats_with_brown_fur: id (автономный номер), cat_fk
Затем вы можете выбрать случайную запись из этой таблицы на основе идентификатора автономного номера, и она будет быстрой и даст равномерно распределенные случайные результаты. Но на самом деле, если вы выбираете из множества наборов критериев, у вас будут некоторые накладные расходы на ведение этих таблиц.
Во всяком случае, это мой текущий взгляд. Удачи