|
Просьба направить на путь истинный)))
|
|||
---|---|---|---|
#18+
https://www.sql.ru/forum/1311219/zapros-na-n-kratnuu-blochnuu-vyborku-iz-sluchaynoy-pozicii-tablicy В изначально целевой теме создал топик, но, вероятно, там этот вопрос не особо актуален. И т.к. команды слегка одинаковы в MySQL и SQlite - то и тут попрошу посмотреть, оценить варианты этой злободневной выборки... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 11:09 |
|
Просьба направить на путь истинный)))
|
|||
---|---|---|---|
#18+
Нет, вот вы реально думаете, что кто-то будет туды-сюды прыгать? Уж если даже Вам лень два раза разместить вопрос... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 13:13 |
|
Просьба направить на путь истинный)))
|
|||
---|---|---|---|
#18+
В рамках MySQL описанная ТАМ проблема решается элементарно. Сваливаем всю выборку во временную таблицу, нумеруя записи при требуемой сортировке, после чего по номеру и длине страницы легко считаем требуемые номера записей. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 13:16 |
|
Просьба направить на путь истинный)))
|
|||
---|---|---|---|
#18+
AkinaНет, вот вы реально думаете, что кто-то будет туды-сюды прыгать? Уж если даже Вам лень два раза разместить вопрос... Скопировать не вопрос - но разве среднестатистическое правило на усредненном форуме в сети не галсит - не копипейсти проблему целиком - сделай ссылку, или в спойлер засунь. вот я и дал для начала ссылку - но можно и целиком всё засунуть.. в спойлер: Приветствую! Есть необходимость за один запрос получать 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). Т.е. нарушаем правило: "блоки не должны пересекаться!" ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 13:24 |
|
Просьба направить на путь истинный)))
|
|||
---|---|---|---|
#18+
AkinaВ рамках MySQL описанная ТАМ проблема решается элементарно. Сваливаем всю выборку во временную таблицу, нумеруя записи при требуемой сортировке, после чего по номеру и длине страницы легко считаем требуемые номера записей. вот что-то не ясно элементарно. "Сваливаем всю выборку" а ВСЮ - это какую? Итоговую? Дык я ее и стараюсь получить. И если она у меня уже есть - нафига мне ее куда-то "переливать"? Промежуточную? А по какому условию она промежуточная? И проблема случайного пересечения случайным образом выбранных старта и конца N блоков от этого, имхо, ни куда не исчезла... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 13:28 |
|
Просьба направить на путь истинный)))
|
|||
---|---|---|---|
#18+
Познающийесли она у меня уже есть - нафига мне ее куда-то "переливать"? Ну да, давайте для следующей страницы её заново запросим... Познающийпроблема случайного пересечения случайным образом выбранных старта и конца N блоков от этого, имхо, ни куда не исчезла... Да бред какой-то у тебя с этими случайными блоками. Ну решил ты выбирать по 5 записей на блок. А всего их 20... выбрал с 1 по 6, потом с 9 по 13, потом с 15 по 19... четвёртый блок должен бы быть - а нету! ты ж его слитным, "подряд", хочешь, а у тебя ошмётки. ПознающийТ.е. нарушаем правило: "блоки не должны пересекаться!" А чтобы этого не было, ты просто обязан запоминать, что показывал, а что нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 13:42 |
|
Просьба направить на путь истинный)))
|
|||
---|---|---|---|
#18+
Akina... Да бред какой-то у тебя с этими случайными блоками. Ну решил ты выбирать по 5 записей на блок. А всего их 20... выбрал с 1 по 6, потом с 9 по 13, потом с 15 по 19... четвёртый блок должен бы быть - а нету! ты ж его слитным, "подряд", хочешь, а у тебя ошмётки. Во-первых ,давайте слегка "исправим" выборку блоков. Помните - я писал про случайность. Все же в этом случае для таблицы из 20 записей блоки случайно пойдут так: сперва с 9 по 13, потом с 1 по 6, потом с 15 по 19, а четвертого ... да - его не будет. Это нормально. Если запрошено N блоков - это это число рассматривается как Максимум. Следовательно когда я получу только 4 блока вместо ожидаемых 5 из этой таблицы - остальные записи (7, 8, 14 и 20) я "подберу" для фин.обработки более простым селектом. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 13:58 |
|
Просьба направить на путь истинный)))
|
|||
---|---|---|---|
#18+
AkinaПознающийТ.е. нарушаем правило: "блоки не должны пересекаться!" А чтобы этого не было, ты просто обязан запоминать, что показывал, а что нет. Но запоминание не гарантирует от случайного пересечения! Берем наш пример на 20 записей. Надо два блока по 5 записей. Сперва выбрался блок с 4 и по 9 запись, а потом метод случайности выдал для второго блока: с 8 и по 13. УПС. пересечение... и там 8, и здесь. надо повторить выборку - и ... теперь блок с 12 и по 17 запись случайно определился. Эт норм.... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 14:03 |
|
Просьба направить на путь истинный)))
|
|||
---|---|---|---|
#18+
Да нет проблем. Имеется 20 записей. Имеется размер блока в 5 записей. Изначально, сразу, помечаем записи с 17 по 20 как не подходящие в качестве первой записи блока - начинающийся с любой из этих записей блок будет иметь недостаточный размер. Итого, в качестве пригодных для выбора у нас остались записи с 1 по 16. ПознающийБерем наш пример на 20 записей. Надо два блока по 5 записей. Сперва выбрался блок с 4 и по 9 запись,Ну, наверное, с 4 по 8... Да, допустим, случайный выбор начала блока дал число 4, соответственно при 5 записях на блок это будут записи с 4 по 8. Помечаем: - записи с 4 по 8 - как выбранные - записи с 1 по 3 - как входящие в блок недостаточного для выборки размера. Теперь под второй блок мы будем выбирать начальную запись из оставшегося диапазона от 9 до 16 записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 14:57 |
|
Просьба направить на путь истинный)))
|
|||
---|---|---|---|
#18+
Akina, что-то я не понимаю. Прологнируем пример на 100000 исходных записей. Надо выбрать 4 блока по 5 записей. Конечно я понимаю, что тут RAND по первой навыдаёт стока непересекающихся блоков, что хоть заселектируйся. НО гипотетически предположим, что первый select rand выдал блок с 100 по 104 включительно запись. А второй rand выдал с 103 по 107 включительно. Упс, пересечение.... И как я тут должен "изначально, сразу, как не подходящие для выбора" какие-то записи пометить? Никак? А алгоритм-то должен сработать для любых входных данных. Т.е. это действие "пометки" подпадает под некое условие? Типа выполняем "если"... и не выполняем в обратном случае.. И все же - этот алгоритм как бы не похож на выполняемый за один SELECT. А основная суть именно такая - он должен за один присест выбрать требуемые блоки записей... В oracle вроде такая проблема гуглится как "multiple sequential disjoint ranges from a single table" и даже вроде имеет большое практическое применение.... но то КАК там идет решение... высшая физика от Эйнштейна, блин.... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 15:18 |
|
Просьба направить на путь истинный)))
|
|||
---|---|---|---|
#18+
ПознающийПрологнируем пример на 100000 исходных записей. Надо выбрать 4 блока по 5 записей.Ок. Помечаем записи 99997-100000 как невалидные. Делаем первую выборку. Познающийпредположим, что первый select rand выдал блок с 100 по 104 включительно запись Т.е. RAND() даёт 100. Помечаем записи 100-104 как использованные, и записи 96-99 как невалидные. ПознающийА второй rand выдал с 103 по 107 включительно. Второй RAND() не может выдать 103, поскольку запись 103 уже помечена. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 16:08 |
|
Просьба направить на путь истинный)))
|
|||
---|---|---|---|
#18+
Akina..... Помечаем записи .... вот что это означает? у меня в том месте, где надо втыкнуть этот код на sql есть тока возможность воткнуть один вызов... тока на sql... А в рамках одного вызова я чет не могу даже теоретически представить как и где можно что-то спокойно помечать и тут же получать итоговую выборку.... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 17:47 |
|
Просьба направить на путь истинный)))
|
|||
---|---|---|---|
#18+
Познающийу меня в том месте, где надо втыкнуть этот код на sql есть тока возможность воткнуть один вызов...Хранимая процедура? Как раз, один вызов. ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 17:57 |
|
Просьба направить на путь истинный)))
|
|||
---|---|---|---|
#18+
vkleПознающийу меня в том месте, где надо втыкнуть этот код на sql есть тока возможность воткнуть один вызов...Хранимая процедура? Как раз, один вызов. увы, тока прямые команды а-ля тока SELECT FROM where group order ..... ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 18:39 |
|
Просьба направить на путь истинный)))
|
|||
---|---|---|---|
#18+
Познающийпрямые команды а-ля тока SELECT FROM where group order .....В рамках запроса такое можно реализовать разве что на восьмой версии... и то монстрик ещё тот получится. Хранимка будет на порядок проще. На пятой - вообще не представляю, как реализовать (переменные, вероятно, тоже non grata). ... |
|||
:
Нравится:
Не нравится:
|
|||
09.04.2019, 18:47 |
|
|
start [/forum/topic.php?fid=47&msg=39799008&tid=1829195]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
63ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 172ms |
0 / 0 |