| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Составление SQL-запросов > [MySQL] Случайная сортировка с условием |
| Автор: Sanchezzz 17.8.2012, 06:57 | ||||
Добрый день. Есть динамически составленный запрос который составляется через большую функцию впыхе которая на выходе выдает такое
Условий может быть сколько угодно (до60) они добавляются в запрос примерно так
Cлучайная выборка выполняется с помощью варварского метода ORDER BY RAND() хотелось бы переделать под элегантный быстрый вариант. Подскажите как лучше реализовать случайную выборку |
| Автор: Sanchezzz 17.8.2012, 10:26 | ||||||||||||
| SQL_CALC_FOUND_ROWS только считает статистику сколько всего возможно было выбрано если не использовался лимит с ткущим условием выборки это быстрее чем тоже самое с count(*) в отдельным запросе. (я планирую его убирать при рандомных выборках + с лимитом начало позиции оставляя только просто LIMIT N ) И если мне не изменяет память от прочитаного когда то давно то SQL_CALC_FOUND_ROWS в myIsam бреется из собственной хранения информации о таблице когда для InnoDB наоборот считается тем самым выполнения делается дольше но результат такой же.
Структура такая хранения данных о объекте в одной таблице ( Мусора ) выборка происходит по принцепу обращения к одной и тойже таблице много раз по условию которое строится по специальному объекту класса в пхп 1 критерия условия поиска по нужному полю
На выходе получаем часть фильтра который потом склеиваем с 2 и 3 куском фильтра в последовательности вызова.
2 критерия поиска по другому полю
на выходе получаем
Эти 2 части запросов складываются в той последовательности в какой они были вызваны на выходе получаем полный запрос
Если есть решения как это написать лучше я посмотрю и почитаю с удовольствием, но сразу скажу что SELF JOIN выборка не подходила под мои требования |
| Автор: Akina 17.8.2012, 10:36 | ||||
Чем
отличается от
? |
| Автор: Sanchezzz 17.8.2012, 10:39 | ||||||
| Есть соображения пока только такие: Обвернуть все в дополнительный SELECT b перенести rand() во временную таблицу с меньшим количеством данных
Добавлено через 10 минут и 59 секунд
Нечем оба одинаково работаю за исключением того что мы не создаем лишнею временную таблицу |
| Автор: Akina 17.8.2012, 10:56 |
Просил быстрее? используй. |