uForum.uz

uForum.uz (https://uforum.uz/index.php)
-   Разное/IT (https://uforum.uz/forumdisplay.php?f=398)
-   -   [Без оффтопа] Развлекаемся с SQL (https://uforum.uz/showthread.php?t=19923)

Alisher Umarov 13.10.2013 15:50

Развлекаемся с SQL
 
Ставим задачи - находим эффектные решения.
(В базе MySQL)

1. Виртуальный колхоз "Кизил пиёз. Пять бригад каждый день сдают на склад пиёз в кг.
Текущий отчёт:
За день. За неделю. За месяц. За квартал. За год.

ps. Без флейма плиз.
Красивые решения плюсуем.

JackDaniels 13.10.2013 16:26

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()), но неэстетично. :)

Denis Shlyapnikov 13.10.2013 16:54

`id` in уже не ?

Denis Shlyapnikov 13.10.2013 16:57

Я как-то работал с записями больше чем 1М, там я реализовал "сложную (с relations)" выборку через временные таблицы. Работает не то что быстро, а моментально.

JackDaniels 13.10.2013 17:14

Цитата:

Сообщение от Denis Shlyapnikov (Сообщение 945295)
там я реализовал "сложную (с relations)" выборку через временные таблицы

Чем это поможет при сортировке?
Или это к вопросу №1 было?

Denis Shlyapnikov 13.10.2013 17:20

Нет, Руслан. Это к вашей задачи решение. Спокойно можно использовать ORDER BY RAND() + дополнительные маневры в виде where, group, join

JackDaniels 13.10.2013 17:38

Цитата:

Сообщение от Denis Shlyapnikov (Сообщение 945300)
к вашей задачи решение. Спокойно можно использовать ORDER BY RAND() + дополнительные маневры в виде where, group, join

Так хотелось бы решение как раз и увидеть.
Здесь его нет, только слово «маневры». :)

Alisher Umarov 13.10.2013 19:08

Зачем узнавать max если дано 1М записей?

Какое практическое значение у order by rand()? Сортировка по случайному значению?

Ну в общем читабельно тут

http://hudson.su/2010/09/16/mysql-optimizaciya-order-by-rand/

JackDaniels 13.10.2013 19:12

Цитата:

Сообщение от Alisher Umarov (Сообщение 945342)
Зачем узнавать max если дано 1М записей?

Это ведь приблизительно.
Элементы добавляются/удаляются.

Цитата:

Сообщение от Alisher Umarov (Сообщение 945342)
Какое практическое значение у order by rand()? Сортировка по случайному значению?

Порой нужно показать что-то в случайном порядке.

Denis Shlyapnikov 13.10.2013 19:15

Примерно так можно работать с большим объемом данных, где нужно делать выборки:
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. Перевод: zCarot
OOO «Единый интегратор UZINFOCOM»