![]() |
Развлекаемся с SQL
Ставим задачи - находим эффектные решения.
(В базе MySQL) 1. Виртуальный колхоз "Кизил пиёз. Пять бригад каждый день сдают на склад пиёз в кг. Текущий отчёт: За день. За неделю. За месяц. За квартал. За год. ps. Без флейма плиз. Красивые решения плюсуем. |
2. Дано 1М записей;
Не самый производительный сервер; Нужно: ORDER BY RAND() LIMIT 10; В качестве временного решения работает: Первый запрос: узнаем количество записей в базе ($min, $max) В PHP генерим 10 "случайных" индексов: $id[$i] = rand($min, $max); Второй запрос: UNION (SELECT * FROM `a` WHERE `id` = $id[0] LIMIT 1) UNION (SELECT * FROM `a` WHERE `id` = $id[1] LIMIT 1)… и так далее. Проверяем результат, если записи по одному из ID не было (в ID бывают "дырки"), и получили меньше чем 10, добираем нужное количество запросов. Такая штуковина работает быстро (в сотни, и даже тысячи раз быстрее родного BY RAND()), но неэстетично. :) |
`id` in уже не ?
|
Я как-то работал с записями больше чем 1М, там я реализовал "сложную (с relations)" выборку через временные таблицы. Работает не то что быстро, а моментально.
|
Цитата:
Или это к вопросу №1 было? |
Нет, Руслан. Это к вашей задачи решение. Спокойно можно использовать ORDER BY RAND() + дополнительные маневры в виде where, group, join
|
Цитата:
Здесь его нет, только слово «маневры». :) |
Зачем узнавать max если дано 1М записей?
Какое практическое значение у order by rand()? Сортировка по случайному значению? Ну в общем читабельно тут http://hudson.su/2010/09/16/mysql-optimizaciya-order-by-rand/ |
Цитата:
Элементы добавляются/удаляются. Цитата:
|
Примерно так можно работать с большим объемом данных, где нужно делать выборки:
create temporary table`temp` select * `db` .... , дальше уже обращаться ко временной таблице select .. from `temp` |
| Текущее время: 11:27. Часовой пояс GMT +5. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод:
OOO «Единый интегратор UZINFOCOM»