powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Просьба направить на путь истинный)))
15 сообщений из 15, страница 1 из 1
Просьба направить на путь истинный)))
    #39798613
Познающий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
https://www.sql.ru/forum/1311219/zapros-na-n-kratnuu-blochnuu-vyborku-iz-sluchaynoy-pozicii-tablicy

В изначально целевой теме создал топик, но, вероятно, там этот вопрос не особо актуален.
И т.к. команды слегка одинаковы в MySQL и SQlite - то и тут попрошу посмотреть, оценить варианты этой злободневной выборки...
...
Рейтинг: 0 / 0
Просьба направить на путь истинный)))
    #39798714
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, вот вы реально думаете, что кто-то будет туды-сюды прыгать? Уж если даже Вам лень два раза разместить вопрос...
...
Рейтинг: 0 / 0
Просьба направить на путь истинный)))
    #39798718
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В рамках MySQL описанная ТАМ проблема решается элементарно. Сваливаем всю выборку во временную таблицу, нумеруя записи при требуемой сортировке, после чего по номеру и длине страницы легко считаем требуемые номера записей.
...
Рейтинг: 0 / 0
Просьба направить на путь истинный)))
    #39798725
Познающий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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). Т.е. нарушаем правило: "блоки не должны пересекаться!"
...
Рейтинг: 0 / 0
Просьба направить на путь истинный)))
    #39798729
Познающий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaВ рамках MySQL описанная ТАМ проблема решается элементарно. Сваливаем всю выборку во временную таблицу, нумеруя записи при требуемой сортировке, после чего по номеру и длине страницы легко считаем требуемые номера записей.
вот что-то не ясно элементарно.
"Сваливаем всю выборку" а ВСЮ - это какую? Итоговую? Дык я ее и стараюсь получить. И если она у меня уже есть - нафига мне ее куда-то "переливать"? Промежуточную? А по какому условию она промежуточная? И проблема случайного пересечения случайным образом выбранных старта и конца N блоков от этого, имхо, ни куда не исчезла...
...
Рейтинг: 0 / 0
Просьба направить на путь истинный)))
    #39798744
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Познающийесли она у меня уже есть - нафига мне ее куда-то "переливать"?
Ну да, давайте для следующей страницы её заново запросим...

Познающийпроблема случайного пересечения случайным образом выбранных старта и конца N блоков от этого, имхо, ни куда не исчезла...
Да бред какой-то у тебя с этими случайными блоками.

Ну решил ты выбирать по 5 записей на блок. А всего их 20... выбрал с 1 по 6, потом с 9 по 13, потом с 15 по 19... четвёртый блок должен бы быть - а нету! ты ж его слитным, "подряд", хочешь, а у тебя ошмётки.

ПознающийТ.е. нарушаем правило: "блоки не должны пересекаться!"
А чтобы этого не было, ты просто обязан запоминать, что показывал, а что нет.
...
Рейтинг: 0 / 0
Просьба направить на путь истинный)))
    #39798759
Познающий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina...
Да бред какой-то у тебя с этими случайными блоками.

Ну решил ты выбирать по 5 записей на блок. А всего их 20... выбрал с 1 по 6, потом с 9 по 13, потом с 15 по 19... четвёртый блок должен бы быть - а нету! ты ж его слитным, "подряд", хочешь, а у тебя ошмётки.


Во-первых ,давайте слегка "исправим" выборку блоков. Помните - я писал про случайность.
Все же в этом случае для таблицы из 20 записей блоки случайно пойдут так:
сперва с 9 по 13,
потом с 1 по 6,
потом с 15 по 19,
а четвертого ... да - его не будет. Это нормально. Если запрошено N блоков - это это число рассматривается как Максимум.
Следовательно когда я получу только 4 блока вместо ожидаемых 5 из этой таблицы - остальные записи (7, 8, 14 и 20) я "подберу" для фин.обработки более простым селектом.
...
Рейтинг: 0 / 0
Просьба направить на путь истинный)))
    #39798762
Познающий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaПознающийТ.е. нарушаем правило: "блоки не должны пересекаться!"
А чтобы этого не было, ты просто обязан запоминать, что показывал, а что нет.
Но запоминание не гарантирует от случайного пересечения!
Берем наш пример на 20 записей. Надо два блока по 5 записей.
Сперва выбрался блок с 4 и по 9 запись,
а потом метод случайности выдал для второго блока: с 8 и по 13. УПС. пересечение... и там 8, и здесь.
надо повторить выборку - и ... теперь блок с 12 и по 17 запись случайно определился. Эт норм....
...
Рейтинг: 0 / 0
Просьба направить на путь истинный)))
    #39798814
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да нет проблем.

Имеется 20 записей. Имеется размер блока в 5 записей.

Изначально, сразу, помечаем записи с 17 по 20 как не подходящие в качестве первой записи блока - начинающийся с любой из этих записей блок будет иметь недостаточный размер.

Итого, в качестве пригодных для выбора у нас остались записи с 1 по 16.
ПознающийБерем наш пример на 20 записей. Надо два блока по 5 записей.
Сперва выбрался блок с 4 и по 9 запись,Ну, наверное, с 4 по 8...

Да, допустим, случайный выбор начала блока дал число 4, соответственно при 5 записях на блок это будут записи с 4 по 8.

Помечаем:

- записи с 4 по 8 - как выбранные
- записи с 1 по 3 - как входящие в блок недостаточного для выборки размера.

Теперь под второй блок мы будем выбирать начальную запись из оставшегося диапазона от 9 до 16 записи.
...
Рейтинг: 0 / 0
Просьба направить на путь истинный)))
    #39798832
Познающий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,

что-то я не понимаю. Прологнируем пример на 100000 исходных записей. Надо выбрать 4 блока по 5 записей.
Конечно я понимаю, что тут RAND по первой навыдаёт стока непересекающихся блоков, что хоть заселектируйся.
НО гипотетически предположим, что первый select rand выдал блок с 100 по 104 включительно запись.
А второй rand выдал с 103 по 107 включительно. Упс, пересечение....
И как я тут должен "изначально, сразу, как не подходящие для выбора" какие-то записи пометить? Никак?
А алгоритм-то должен сработать для любых входных данных. Т.е. это действие "пометки" подпадает под некое условие?
Типа выполняем "если"... и не выполняем в обратном случае..

И все же - этот алгоритм как бы не похож на выполняемый за один SELECT. А основная суть именно такая - он должен за один присест выбрать требуемые блоки записей...

В oracle вроде такая проблема гуглится как "multiple sequential disjoint ranges from a single table" и даже вроде имеет большое практическое применение.... но то КАК там идет решение... высшая физика от Эйнштейна, блин....
...
Рейтинг: 0 / 0
Просьба направить на путь истинный)))
    #39798870
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПознающийПрологнируем пример на 100000 исходных записей. Надо выбрать 4 блока по 5 записей.Ок.
Помечаем записи 99997-100000 как невалидные.
Делаем первую выборку.
Познающийпредположим, что первый select rand выдал блок с 100 по 104 включительно запись
Т.е. RAND() даёт 100. Помечаем записи 100-104 как использованные, и записи 96-99 как невалидные.
ПознающийА второй rand выдал с 103 по 107 включительно.
Второй RAND() не может выдать 103, поскольку запись 103 уже помечена.
...
Рейтинг: 0 / 0
Просьба направить на путь истинный)))
    #39798965
Познающий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina..... Помечаем записи ....
вот что это означает? у меня в том месте, где надо втыкнуть этот код на sql есть тока возможность воткнуть один вызов...
тока на sql... А в рамках одного вызова я чет не могу даже теоретически представить как и где можно что-то спокойно помечать и тут же получать итоговую выборку....
...
Рейтинг: 0 / 0
Просьба направить на путь истинный)))
    #39798979
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Познающийу меня в том месте, где надо втыкнуть этот код на sql есть тока возможность воткнуть один вызов...Хранимая процедура? Как раз, один вызов.
...
Рейтинг: 0 / 0
Просьба направить на путь истинный)))
    #39799002
Познающий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkleПознающийу меня в том месте, где надо втыкнуть этот код на sql есть тока возможность воткнуть один вызов...Хранимая процедура? Как раз, один вызов.
увы, тока прямые команды а-ля тока SELECT FROM where group order .....
...
Рейтинг: 0 / 0
Просьба направить на путь истинный)))
    #39799008
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Познающийпрямые команды а-ля тока SELECT FROM where group order .....В рамках запроса такое можно реализовать разве что на восьмой версии... и то монстрик ещё тот получится. Хранимка будет на порядок проще. На пятой - вообще не представляю, как реализовать (переменные, вероятно, тоже non grata).
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Просьба направить на путь истинный)))
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]