|
Запрос на N-кратную блочную выборку из случайной позиции таблицы
|
|||
---|---|---|---|
#18+
Приветствую! Есть необходимость за один запрос получать 1/3/10... т.е. "N" блоков по 10/25/32/... т.е. "X" записей в каждом блоке. В виде одной итоговой выборки с кол-вом строк N*X. Столбцами выступают уникальные данные. К примеру пусть их два. При следующих доп.условиях: параметры N и X задаются в теле запроса/биндятся для внешнего API. Внутри блоков записи идут в сортировке, заданной параметром order BY ..... Их кол-во "подряд" - и есть первый входной параметр запроса. Еще параметром для этих блоков являются вшитые пара условий вида where param1 is null and param2 = 12. Эти блоки должны выбираться случайным образом. Т.е. если надо найти 3 блока по 5 записей, то, к примеру, первый блок выбирается с первой записи в таблице и по пятую. Второй блок - с 118 и по 123. Третий блок с 21 записи и по 26. И всего в итоговой таблице/выборке мы видим 3*5=15 записей. Т.е. очередность выборки блоков - величина случайная! НО блоки не должны пересекаться! Т.е. всегда очередной блок К должен содержать "X" записей, которые НЕ участвовали в блоках с 1 по К-1 шаг. Т.е. все 15 примерных записей из примера выше - уникальны! Равно как и в самой таблице эти поля уникальны. Кто как видит решение кроме как "в лоб" - когда N раз повторяем запрос с главной частью - LIMIT X OFFSET abs(random() % (select count(*) from TABLE)); Просто в этом случае на I-ом повторе (I<=N) может случайно (нам же стартовую позицию блока=OFFSET надо случайно выбирать) выйти так, что часть записей этого блока (или даже весь он) окажутся равны уже ранее выбранным записям прежнего блока из предыдущего шага К=[1; I). Т.е. нарушаем правило: "блоки не должны пересекаться!" ... |
|||
:
Нравится:
Не нравится:
|
|||
08.04.2019, 13:38 |
|
|
start [/forum/topic.php?fid=54&fpage=3&tid=2008402]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
27ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
34ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 112ms |
0 / 0 |